在Java中调用MATLAB函数的完整流程:从打包-jar-到服务器部署

为什么在 Java 中调用 MATLAB 函数?

最近在做复杂网络仿真平台时,需要在 Java 环境中调用一些 MATLAB 编写的算法函数。这些函数在matlab中已经调试好经过了验证,就不想在java换再实现一套同样的逻辑。

一开始以为会很麻烦,后来发现 MATLAB 官方其实提供了完整的 Java 支持。其实就是用 MATLAB Compiler SDK 就能直接导出 .jar 文件,然后在 Java 项目中调用。然后配置好环境就可以轻松运行了。

这篇文章记录完整流程:

  1. MATLAB 如何导出 jar
  2. 本地如何配置运行环境
  3. 服务器端如何部署(含 MATLAB Runtime)

一、MATLAB 导出 jar 包

MATLAB 自带 Compiler SDK,可以把 .m 文件打包成 Java 可调用的 jar。

示例函数:

matlab 复制代码
% add.m
function y = add(a, b)
    y = a + b;
end

然后在当前函数(add.m)文件下 在 MATLAB 的命令行执行:

matlab 复制代码
mcc -W 'java:addClass,AddClass' -T link:lib add.m

执行后会生成:

  • AddClass.jar
  • AddClass.ctf
  • 以及 for_testing 文件夹等辅助内容

二、本地环境配置(Java 调用)

在本地 Java 项目中使用刚生成的 jar。

假设使用 IntelliJ IDEA。

1. 导入文件

AddClass.jarAddClass.ctf 放到工程文件夹下的 libs/ 文件夹。

2. 添加依赖

添加 MATLAB runtime 依赖 javabuilder.jar:

示例位置

复制代码
C:\Program Files\MATLAB\R2023a\toolbox\javabuilder\jar\javabuilder.jar

Maven:

xml 复制代码
<dependency>
  <groupId>com.mathworks</groupId>
  <artifactId>javabuilder</artifactId>
  <scope>system</scope>
  <systemPath>${matlab_home}/toolbox/javabuilder/jar/javabuilder.jar</systemPath>
</dependency>

Gradle:

gradle 复制代码
dependencies {
    implementation files('C:/Program Files/MATLAB/R2023a/toolbox/javabuilder/jar/javabuilder.jar')
}

3. Java 调用代码

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

bash 复制代码
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 程序

bash 复制代码
java -cp .:AddClass.jar:/usr/local/MATLAB/MATLAB_Runtime/v910/java/jar/javabuilder.jar TestMatlab

输出:

复制代码
Result = 3.0

我当时是使用docker构建镜像的,遇到了好几个问题,最后Dockerfile 部分内容如下:

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 同目录

五、总结

虽然也是踩坑了,不过整个过程其实不复杂:

  1. MATLAB 打包 jar
  2. Java 添加依赖
  3. 安装并配置 Runtime
  4. 成功运行

如果部署在服务器上,建议把 MATLAB 模块单独封装成服务(如 Flask / SpringBoot 接口),通过 HTTP 调用,这样更容易维护和扩展。

感谢大家的观看,希望这篇文章能帮到有类似需求的朋友!

也欢迎独立开发的同好与我交流。

相关推荐
听风吟丶2 小时前
Java 9 + 模块化系统实战:从 Jar 地狱到模块解耦的架构升级
开发语言·python·pycharm
spencer_tseng2 小时前
easy-captcha-1.6.2.jar
java·jar
love530love2 小时前
【笔记】xFormers版本与PyTorch、CUDA对应关系及正确安装方法详解
人工智能·pytorch·windows·笔记·python·深度学习·xformers
2301_764441332 小时前
Streamlit搭建内网视频通话系统
python·https·音视频
Bowen_CV2 小时前
Linux 系统安装与环境配置实践
linux·运维·服务器
伟大的大威2 小时前
LLM + TFLite 搭建离线中文语音指令 NLU并部署到 Android 设备端
python·ai·nlu
旭编2 小时前
牛客周赛 Round 117
java·开发语言
无敌最俊朗@3 小时前
01-总结
java·jvm·数据库
m5655bj3 小时前
Python 查找并高亮显示指定 Excel 数据
开发语言·python·excel