当前位置: 首页 > news >正文

在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。

示例函数:

% 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.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:

<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.UnsatisfiedLinkErrorRuntime 库未配置检查 LD_LIBRARY_PATH
Could not find library mclmcrrt9_10.dllMCR 未安装或版本不匹配安装对应版本 MCR
ClassNotFoundExceptionjar 路径错误检查 classpath
输出为空或异常退出CTF 路径错误保证 .ctf 文件与 jar 同目录

五、总结

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

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

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

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

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

http://www.dtcms.com/a/597963.html

相关文章:

  • 破局新能源暗访:卡索(CASO)汽车调查的“三重洞察”艺术
  • 网站建设案例市场wordpress时间文件夹
  • LINUX拯救模式
  • iis 发布网站内部服务器错误推广普通话手抄报
  • 1个ip可以做几个网站吗计算机it培训班
  • 网站策划的内容有那些本科自考报名的时间
  • 从基础建设到全面融合:企业网络与安全架构的进化之路
  • YOLOv8-World 开放词汇检测模型介绍
  • 公司介绍网站怎么做新网域名管理
  • 【前端学习】阿里前端面试题
  • 需求开发:从愿景到规格的完整路径
  • 青少年思想道德建设网站高端网站建设案例
  • 华为仓颉编程语言 | 发展历程与创新应用
  • 外贸网站海外推广3个必去网站柚子皮wordpress主题
  • 宁波网站制作哪家强上海企业建站咨询
  • Python中json.loads()和json.dumps()的区别
  • 在线教育系统源码架构设计指南:高并发场景下的性能优化与数据安全
  • 做wish如何利用数据网站linux是哪个公司开发的
  • LeetCode算法学习之单词拆分
  • 英文网站做百度权重有意义吗wordpress 开发列表网
  • 七代内存(DDR5)技术发展现状
  • 测开高频面试题集锦 | 项目测试 接口测试自动化
  • 郑州上街网站建设公司买东西的网站
  • 卡在触觉的AI,一目科技让机器人从“看世界”到“摸世界”
  • mysql在线DDL
  • K8S RD: Prometheus与Kubernetes高级配置与管理实践:监控、持久化、高可用及安全机制详解
  • 建设一个直播网站要多少钱重庆旅游网站建设
  • 跟我一起学做网站知更鸟wordpress主题下载
  • 【开发者导航】面向生成式模型研发的多模态开发库:Diffusers
  • 小白如何搭建一个网站小游戏入口免费游戏