在Java中调用MATLAB函数的完整流程:从打包-jar-到服务器部署
为什么在 Java 中调用 MATLAB 函数?
最近在做复杂网络仿真平台时,需要在 Java 环境中调用一些 MATLAB 编写的算法函数。这些函数在matlab中已经调试好经过了验证,就不想在java换再实现一套同样的逻辑。
一开始以为会很麻烦,后来发现 MATLAB 官方其实提供了完整的 Java 支持。其实就是用 MATLAB Compiler SDK 就能直接导出 .jar 文件,然后在 Java 项目中调用。然后配置好环境就可以轻松运行了。
这篇文章记录完整流程:
- MATLAB 如何导出 jar
- 本地如何配置运行环境
- 服务器端如何部署(含 MATLAB Runtime)
一、MATLAB 导出 jar 包
MATLAB 自带 Compiler SDK,可以把 .m 文件打包成 Java 可调用的 jar。
示例函数:
% add.m
function y = add(a, b)y = a + b;
end
然后在当前函数(add.m)文件下 在 MATLAB 的命令行执行:
mcc -W 'java:addClass,AddClass' -T link:lib add.m
执行后会生成:
AddClass.jarAddClass.ctf- 以及
for_testing文件夹等辅助内容

二、本地环境配置(Java 调用)
在本地 Java 项目中使用刚生成的 jar。
假设使用 IntelliJ IDEA。
1. 导入文件
将 AddClass.jar、AddClass.ctf 放到工程文件夹下的 libs/ 文件夹。
2. 添加依赖
添加 MATLAB runtime 依赖 javabuilder.jar:
示例位置
C:\Program Files\MATLAB\R2023a\toolbox\javabuilder\jar\javabuilder.jar
Maven:
<dependency><groupId>com.mathworks</groupId><artifactId>javabuilder</artifactId><scope>system</scope><systemPath>${matlab_home}/toolbox/javabuilder/jar/javabuilder.jar</systemPath>
</dependency>
Gradle:
dependencies {implementation files('C:/Program Files/MATLAB/R2023a/toolbox/javabuilder/jar/javabuilder.jar')
}
3. Java 调用代码
import addClass.AddClass;public class TestMatlab {public static void main(String[] args) throws Exception {AddClass addObj = new AddClass();Object[] result = addObj.add(1, 2);System.out.println("Result = " + result[0]);addObj.dispose(); // 释放资源}
}
4. 环境变量
MATLAB Runtime (MCR) 必需。
若未安装 MATLAB,则需单独安装对应版本。
下载地址:
https://www.mathworks.com/products/compiler/matlab-runtime.html
然后配置路径
set PATH=%PATH%;C:\Program Files\MATLAB\MATLAB Runtime\v910\runtime\win64
三、服务器部署(Linux 环境)
1. 安装 MATLAB Runtime
下载地址:
https://www.mathworks.com/products/compiler/matlab-runtime.html
选择与打包版本匹配的 runtime版本,例如 R2023a → v910。
安装路径示例:
/usr/local/MATLAB/MATLAB_Runtime/v910/
2. 配置环境变量
编辑 /etc/profile:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/MATLAB/MATLAB_Runtime/v910/runtime/glnxa64
export XAPPLRESDIR=/usr/local/MATLAB/MATLAB_Runtime/v910/X11/app-defaults
执行 source /etc/profile。
3. 运行 Java 程序
java -cp .:AddClass.jar:/usr/local/MATLAB/MATLAB_Runtime/v910/java/jar/javabuilder.jar TestMatlab
输出:
Result = 3.0
我当时是使用docker构建镜像的,遇到了好几个问题,最后Dockerfile 部分内容如下:
# ------------------------------
# 拷贝 MATLAB 编译生成的整个分发目录
# (包含 add.jar, run_xxx.sh, .ctf 等)
# ------------------------------
COPY matlab/ /app/matlab-dist/# ------------------------------
# 设置 MATLAB Runtime 环境变量
# 容器启动时挂载宿主机 /usr/local/MATLAB/MATLAB_Runtime/v96
# ------------------------------
ENV MCR_ROOT=/usr/local/MATLAB/MATLAB_Runtime/v96
ENV LD_LIBRARY_PATH=$MCR_ROOT/runtime/glnxa64:$MCR_ROOT/bin/glnxa64:$MCR_ROOT/sys/os/glnxa64:/app/matlab-dist
ENV JAVA_LIB_PATH=$LD_LIBRARY_PATH# 把 matlab-dist 下的 jar 加入 system property java.class.path
ENV JAVA_TOOL_OPTIONS="-Djava.class.path=/app/app.jar:/app/matlab-dist/*:$MCR_ROOT/toolbox/javabuilder/jar/javabuilder.jar"
四、常见问题
| 问题 | 原因 | 解决办法 |
|---|---|---|
| java.lang.UnsatisfiedLinkError | Runtime 库未配置 | 检查 LD_LIBRARY_PATH |
| Could not find library mclmcrrt9_10.dll | MCR 未安装或版本不匹配 | 安装对应版本 MCR |
| ClassNotFoundException | jar 路径错误 | 检查 classpath |
| 输出为空或异常退出 | CTF 路径错误 | 保证 .ctf 文件与 jar 同目录 |
五、总结
虽然也是踩坑了,不过整个过程其实不复杂:
- MATLAB 打包 jar
- Java 添加依赖
- 安装并配置 Runtime
- 成功运行
如果部署在服务器上,建议把 MATLAB 模块单独封装成服务(如 Flask / SpringBoot 接口),通过 HTTP 调用,这样更容易维护和扩展。
感谢大家的观看,希望这篇文章能帮到有类似需求的朋友!
也欢迎独立开发的同好与我交流。
