本文档详细说明了Linux下Web项目调用Matlab函数的完整操作,文章适合对Java、Linux有一定基础了解的人群(不了解也没什么,无非是多试几次)。因Linux作为服务器,所以未在其上安装Matlab主程序,只安装了运行环境MCR。
本文档内所述的所有版本软件均以32位为准,JDK与MCR也使用32位。若你的系统为64位,Linux系统同样为64位,则请尽量选择使用64位版本的JDK与MCR。
由于Matlab的版本限制问题,请保证Matlab主程序和MATLABCompiler Runtime版本一致,本文以Matlab_R2012a_glnx32演示。
本文介绍的是web项目使用jsp调用matlab,环境需要安装JDK,且需设定完整JAVA环境变量,本文Windows与Linux中均需安装同版本同位数的JDK。
注:本文中出现的 win32指32位系统,win64则为64位系统。
本文采用的系统版本为中标麒麟国产操作系统,内核Linux,调用Matlab。
MCR= MATLAB Compiler Runtime
本文中会在各个环节最后一项中注明本环节容易出现的错误和解决办法。
实现该功能原理:
在windows上编写Matlab的算法,后打包发布成Jar文件;编写Java代码,引用Matlab运行包JavaBuild.jar,并加入算法Jar包。
若单独运行该算法,则将Java代码与这2个Jar包进行发布打包成Jar,将此Jar包导入Linux后通过命令java –jar xxx.jar执行该程序。
若该算法是项目一部分,则不需要生成Jar包,直接在项目中加入算法包和运行包,调用即可。
==========================================================================
实现步骤:
1、 安装Matlab
2、 安装MATLABCompiler Runtime
3、 编写Matlab算法
4、 算法生成Jar包
5、 编写Java代码调用算法Jar包
6、 发布完整Jar执行
7、 Windows下Web项目JSP调用Matlab
8、 调用Matlab问题分析与解决
9、 Linux安装MATLAB Compiler Runtime操作
10、Linux安装Tomcat
11、Linux下web项目JSP调用Matlab
==========================================================================
安装Matlab(省略非必要说明):
1、 直接点开安装文件,执行setup.exe。
2、 安装过程中请以不联网安装。
3、 该文件秘钥请到安装文件路径:crack/ install.txt中,看到standalone选项下的enter the "file installation key",复制其中的一串数字,本文为38699-60149-36808-21840-05491。
4、后续步骤按提示下一步安装完成即可。
5、安装完毕后,请打开程序目录:MATLAB\R2012a\runtime\win64,将文件mclmcrrt7_17.dll放入文件系统:C:\Windows\System32。如果是64位系统,还需放到C:\Windows\SysWOW64
==========================================================================
安装MATLAB Compiler Runtime(省略非必要说明):
1、 如果有与Matlab主程序版本一致,位数一致的安装文件,请直接安装;若没有,则找到安装文件所在目录:MATLAB\R2012a\toolbox\compiler\deploy\win64,找到里面的MCRInstaller.exe,执行安装。(注:标红路径是根据自己的系统位数而定,也可能是win32)
2、 安装过程中请以不联网安装。
3、 激活所需要的license文件,请指向安装文件目录中的:crack/ lic_standalone.dat
4、 安装完成后需要调整本地的环境变量顺序,请将Path中关于MATLAB Compiler Runtime放到Matlab主程序环境变量前面,同时要保证Java环境变量在这两者之前。
例如:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; F:\Program Files\MATLAB\R2012a\runtime\win32;F:\Program Files\MATLAB\R2012a\bin;F:\ProgramFiles\MATLAB\MATLAB Compiler Runtime\v717\runtime\win32
变更为
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;F:\Program Files\MATLAB\MATLAB CompilerRuntime\v714\runtime\win32;F:\Program Files\MATLAB\R2012a\runtime\win32;F:\ProgramFiles\MATLAB\R2012a\bin
==========================================================================
编写Matlab算法并生成Jar:
1、 打开Matlab主程序,MATLAB\R2012a\bin\matlab.exe。
如果CPU为AMD,请添加系统环境变量:BLAS_VERSION:Matlab所在路径
2、这里我们编写一个函数算法,file à new à function,在弹出层填上如下信息。
函数内容为,传入2个参数a、b,运算加减法,返还sum和sub,获取时可以获取1个或2个。接着保存该function,Matlab的算法格式为m。
3、在Matlab主界面Command Window中输入,deployTool。
4、这里直接创建一个新的算法项目,name为指定项目名称,location为指定项目的空间位置,可以自定义,type请选择Java Package,我们这里是用Java调用该程序,点击OK。
5、 在弹出的JavaPackage窗口中,点击Build中class下的add Class,这里需要指定class的名称,该class指的是Java中你调用的Object。
6、 继续点击Addfiles,找到之前编写的function文件,导入进去
7、 点击,会将该算法函数封装成Jar文件,导出目录为3步骤中设置的location地址。
8、 在Math\distrib中的Jar即为算法包(这里的Math是步骤3中的name)。
9、完成。
==========================================================================
编写Java代码调用算法Jar包:
注意事项:此步骤进行前,请保证安装了JDK,cmd环境下执行java命令确认。
1、 创建的Java项目,JDK需要与系统JDK一致,否则可能导致无法本机测试;
这里需要导入Matlab的库,目录为:
MATLAB CompilerRuntime\v717\toolbox\javabuilder\jar\javabuilder.jar
2、 创建Class文件,引入算法jar包到项目中,在代码中调用算法对象。(注意:在项目工程中导入1和2中的jar包,web工程放到lib下面,java工程以引入外部JAR形式)
3、 继续编写完毕代码
4、 编写完毕后直接运行代码测试,输出2个结果21和-1即为正确。若出现问题,请移步第8步。
5、 右键java项目,导出,选择导出为RunnableJar file,下一步
6、 继续,在Launchconfiguration中选择自己编写的java代码。Export destination中填写导出Jar文件的目录和文件名,完成。
7、 测试该Jar,打开cmd窗口,输入 java –jar文件所在目录/MathForJava.jar
若执行成功,则完成测试。
若提示命令有误,检查自己的Java环境变量
8、无法执行本地调用Matlab函数JAR包,容易出现的问题
a检查你的环境变量Path:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
F:\Program Files\MATLAB\MATLAB Compiler Runtime\v717\runtime\win32;
F:\Program Files\MATLAB\R2012a\runtime\win32;F:\ProgramFiles\MATLAB\R2012a\bin;
这是2个程序,需要都配置环境变量。
b Matlab与MCR都要安装,只安装一个不够,因为需要编写函数生成JAR,只生成JAR还需要运行时环境。
==========================================================================
Windows下Web项目JSP调用Matlab:
本环节需要准备JDK和JAVA编译器以及部署项目服务器,本节使用Eclipse和Tomcat。
1、 创建web工程,工程中需要引入javabuild.jar和Matlab函数的JAR包,直接放到lib里
2、 下面进行对Matlab函数Math.jar进行调用,分2种方式,本文仅作简单测试,并不搭建web框架进行传地址。
3、 使用JSP测试调用sum2.jar中封装对象,测试函数输出结果。
A 创建jsp页面,在jsp页面头部文件引用包
<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%> <%@ page import="com.mathworks.toolbox.javabuilder.*" %> <%@ page import="com.mathworks.toolbox.javabuilder.internal.*" %> <%@ page import="Math.MathClass" %>
中间2条引入为需要引入的包和异常处理支持,最后一个为Matlab函数JAR包对应的对象。
页面<body>中增加代码
<% Object[] result = null; MathClass ms = new MathClass(); result = ms.MathTest(1, 44, 11); %> <h2><%=result[0] %></h2>
部署web项目到Tomcat,这里省略部署过程。
之后直接启动Tomcat,访问对应路径:http://localhost:8080/matlabDraw/index.jsp
若访问不出错,有结果为55,则输出正确,测试成功。
B 若需要调用的为作图类型,则使用这个办法。
在web项目,web-inf目录下加入webfigures.tld标签库,文件在Matlab中有,MATLAB\R2012a\toolbox\javabuilder\webfigures
在jsp页面引入A中的标签除外,继续增加
<%@ taglib prefix="wf" uri="/WEB-INF/webfigures.tld"%> <%@ page import="com.mathworks.toolbox.javabuilder.webfigures.WebFigure"%>
在web.xml中也请增加引入Webfigures,
<servlet> <servlet-name>WebFigures</servlet-name> <servlet-class> com.mathworks.toolbox.javabuilder.webfigures.WebFiguresServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>WebFigures</servlet-name> <url-pattern>/WebFigures/*</url-pattern> </servlet-mapping>
最后在页面中加入如下标签,获取函数返回对象WebFigure,然后进行展示。
<wf:web-figure name="YourFigure" scope="session"/>