# Matlab-Java-开发及部署

# 1. 环境准备

# 1.1 Windows环境(本地开发)

  1. # 安装Java的Matlab运行时环境

    1)在windows上安装R2021b或Matlab2018a(目前这两个版本已确定跑通,其他版本没试过) 网上找破解版(http://www.zhanshaoyi.com/6938.html 、 https://mp.weixin.qq.com/s/n0DbWmxEfGVNUngZHqLliA),下载完安装,注意:安装完以后去环境变量中看下是否默认在path中增加了matlab的runtime环境变量,没有的话自行增加。

    2)如果有Matlab算法涉及Simulink或其它的求解器,需要再另外补充安装组件和插件,是否能和Java贯通,需要具体看情况;

  2. # 将算法函数( .m文件)打成jar包

image-20230922155058580

image-20230922155436306

工程名(随便写):arithmetic (它是Matlab library文件夹的名称,和java没有任何关系)

Package名:com.yatong.arithmetic 雅通的算法包

image-20241009102209874

image-20241009102548964

  1. 将打好的Jar包拷贝至项目路径(yatong-simulation/src/main/resources/lib)下

    image-20230922155556246

    另外,要将 matlab安装目录下的javabuilder.jar也拷贝至此处。可以用everything.exe全局搜索一下。

  2. 发布到本地maven

    1)在yatong-simulation模块下的pom.xml中增加以下代码,用以发布jar包,让项目可以正常依赖

    <build>
        <plugins>
            <!--   将自己的jar包打包发布到本地maven  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5.2</version>
                <executions>
                    <!--    Matlab算法包所依赖的环境   -->
                    <execution>
                        <id>install-javabuilder-model</id>
                        <phase>clean</phase>
                        <configuration>
                            <file>${basedir}/src/main/resources/lib/javabuilder.jar</file>
                            <repositoryLayout>default</repositoryLayout>
                            <groupId>com.yatong</groupId>
                            <artifactId>javabuilder</artifactId>
                            <version>R2018a</version>
                            <packaging>jar</packaging>
                            <generatePom>true</generatePom>
                        </configuration>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                    </execution>
    
                    <!--   Matlab算法包   -->
                    <execution>
                        <id>install-javabuilder-model</id>
                        <phase>clean</phase>
                        <configuration>
                            <file>${basedir}/src/main/resources/lib/arithmetic.jar</file>
                            <repositoryLayout>default</repositoryLayout>
                            <groupId>com.yatong</groupId>
                            <artifactId>arithmetic</artifactId>
                            <version>1.0.0</version>
                            <packaging>jar</packaging>
                            <generatePom>true</generatePom>
                        </configuration>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                    </execution>
                 <plugin>
          <plugins>
    <build>
    
    

    2)然后再pom的dependencies中,增加这两个依赖。

    <dependency>
        <groupId>com.yatong</groupId>
        <artifactId>javabuilder</artifactId>
        <version>R2018a</version>
     </dependency>
    
    <!-- 部署时使用这个依赖 算法包  -->
    <dependency>
        <groupId>com.yatong</groupId>
        <artifactId>arithmetic</artifactId>
        <version>1.0.0</version>
        <type>jar</type>
    </dependency>
    

    还有另外一种方式,在开发中提供依赖。(但不建议)

    <dependency>
      <groupId>com.effort</groupId>     <!-- 自定义即可 -->
      <artifactId>piapi</artifactId>    <!-- jar名称 -->
      <version>1.0.0</version>          <!-- 如果jar包未指定自定义即可-->
      <type>jar</type>
      <scope>system</scope>
      <systemPath>${project.basedir}/src/main/resources/lib/arithmetic.jar</systemPath>    <!-- 使用jar所在的绝对路径 -->
    </dependency>
    

    3)在IDEA中点击

    image-20230922160223172

  3. java调用Matlab(参考MatlabUtil.java)

    public void runMatlab(入参){
            try {
                MatlabHelper matlabHelper = new MatlabHelper();
                /*   ----------------------------  入参 Start ----------------------------   */
    			// blablablablablablablabla
                /*   ----------------------------  入参 End ----------------------------   */
               
                /*   ----------------------------  调用Matlab Start ----------------------------   */
                Object[] result = matlabHelper.conf_bus_load(V1, V2, V3, V4, V5, P_g1, P_pv1);     
                    MWNumericArray dataArray = (MWNumericArray)result[i];
                // 遍历Matlab的出参   
                for (int i = 0; i < result.length; i++) {
                    MWNumericArray dataArray = (MWNumericArray)result[i];
                 // 处理结果   
                }
            } catch (MWException e) {
                throw new RuntimeException(e);
            }
    }
    

# 1.2 Linux环境(线上部署)

  1. 线上环境同样需要安装 Matlab2018a,保持版本一致

    去Matlab官网下载Linux版的Matlab2018a,安装(具体步骤在csdn上面搜)

# 2 注意事项

  1. 项目的运行环境需要包括matlab的Runtime运行环境(和java环境类似)。
  2. 用Matlab打包算法包时,尽量包名和类名规范化,这样可以在Java项目中引入时规避各式各样的坑点。

参考

https://blog.csdn.net/shirukai/article/details/123641588a

https://blog.csdn.net/weixin_43876729/article/details/121375871

  1. Matlab的运行时环境 ,要保证其在系统环境变量配置中,其置于path靠前的位置,以防止本机安装多matlab环境被其他环境覆盖的情况出现。

# 3 复杂算法调用的解决方案

【java调用Matlab复杂算法(算法同时含有求解器、符号库时)的解决方案】 1、采用Matlab引擎的方式(目前唯一可用的方式) 2、需要在当前环境安装好求解器和符合库 3、基础代码

MatlabEngine.startMatlab();
eng.eval("addpath('D:\\MyCode\\算法路径")
eng.feval("函数名称r", 入参1,入参2...);

如果求解器收敛时间较长 ,也可使用fevalAsync异步执行 4、在Matlab算法的最后,补上例如xlswrite('values14',Pep); 将出参变量输出到文件(可以csv、xlsx、txt等),然后在java中读取文件获值。