在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 分钟前
【文件管理系列】003:重复文件查找工具
后端·python
CoderYanger2 分钟前
C.滑动窗口-越短越合法/求最长/最大——2958. 最多 K 个重复元素的最长子数组
java·数据结构·算法·leetcode·哈希算法·1024程序员节
洞窝技术10 分钟前
Redis 4.0 升级至 5.0 实施手册
java·redis
FreeCode12 分钟前
一文了解LangGraph智能体设计开发过程:Thinking in LangGraph
python·langchain·agent
wanhengidc13 分钟前
云手机 多端互通 科技
运维·服务器·科技·游戏·智能手机
无代码专家21 分钟前
设备巡检数字化解决方案:构建高效闭环管理体系
java·大数据·人工智能
西柚小萌新25 分钟前
【深入浅出PyTorch】--9.使用ONNX进行部署并推理
人工智能·pytorch·python
nvd1126 分钟前
SSE 流式输出与 Markdown 渲染实现详解
javascript·python
LDG_AGI27 分钟前
【推荐系统】深度学习训练框架(十):PyTorch Dataset—PyTorch数据基石
人工智能·pytorch·分布式·python·深度学习·机器学习
gaize121329 分钟前
不同服务器功能和技术栈适用于什么场景测评
服务器