本文档详细说明了Linux下Web项目调用Matlab函数的完整操作,文章适合对Java、Linux有一定基础了解的人群。因Linux作为服务器,所以未在其上安装Matlab主程序,只安装了运行环境MCR。
本文档内所述的所有版本软件均以32位为准,JDK与MCR也使用32位。若你的系统为64位,Linux系统同样为64位,则请尽量选择使用64位版本的JDK与MCR。
由于Matlab的版本限制问题,请保证Matlab主程序和MATLAB Compiler 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、 安装MATLAB Compiler 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
10、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\oolbox\\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:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v717\\runtime\\win32
变更为
%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;F:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v714\\runtime\\win32;F:\\Program Files\\MATLAB\\R2012a\\runtime\\win32;F:\\Program Files\\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、 在弹出的Java Package窗口中,点击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 Compiler Runtime\\v717\oolbox\\javabuilder\\jar\\javabuilder.jar 2、 创建Class文件,引入算法jar包到项目中,在代码中调用算法对象。(注意:在项目工
程中导入1和2中的jar包,web工程放到lib下面,java工程以引入外部JAR形式)
3、 继续编写完毕代码
4、 编写完毕后直接运行代码测试,输出2个结果21和-1即为正确。若出现问题,请移步
第8步。
5、 右键java项目,导出,选择导出为Runnable Jar file,下一步
6、 继续,在Launch configuration中选择自己编写的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:\\Program Files\\MATLAB\\R2012a\\bin;
这是2个程序,需要都配置环境变量。
bMatlab与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页面头部文件引用包
<%@pagelanguage=\"java\"import=\"java.util.*\"pageEncoding=\"UTF-8\"%> <%@pageimport=\"com.mathworks.toolbox.javabuilder.*\"%>
<%@pageimport=\"com.mathworks.toolbox.javabuilder.internal.*\" %> <%@pageimport=\"Math.MathClass\"%>
中间2条引入为需要引入的包和异常处理支持,最后一个为Matlab函数JAR包对应的对象。
页面
中增加代码 <%Object[] result = null;
MathClassms = newMathClass(); result = ms.MathTest(1, 44, 11); %>
部署web项目到Tomcat,这里省略部署过程。
之后直接启动Tomcat,访问对应路径:http://localhost:8080/matlabDraw/index.jsp
若访问不出错,有结果为55,则输出正确,测试成功。
B若需要调用的为作图类型,则使用这个办法。
在web项目,web-inf目录下加入webfigures.tld标签库,文件在Matlab中有,MATLAB\\R2012a\oolbox\\javabuilder\\webfigures
在jsp页面引入A中的标签除外,继续增加
<%@taglibprefix=\"wf\"uri=\"/WEB-INF/webfigures.tld\"%>
<%@pageimport=\"com.mathworks.toolbox.javabuilder.webfigures.WebFigure\" %>
在web.xml中也请增加引入Webfigures, com.mathworks.toolbox.javabuilder.webfigures.WebFiguresServlet
最后在页面中加入如下标签,获取函数返回对象WebFigure,然后进行展示。
Web调用Matlab问题分析与解决:
部署web调用matlab容易出现很多问题,笔者遇到不少问题,因有些错误信息没有保存,这里没法描述清所有错误,但会把所有配置信息全部加入。
1、 Unsupported major.minor version 51.0
JDK问题,在windows测试环境下,笔者的Eclipse项目环境为1.6,设置电脑系统JDK也为1.6。但运行时产生错误。 解决:
了解了一下,该错误的问题是指的低版本的JVM虚拟机无法加载高版本编译的class文件,51.0版本号指代JDK1.7,笔者项目环境和机器JDK均是1.6,为什么出这个问题呢,排查后只有tomcat的问题了,Eclipse中找到使用的Eclipse配置tomcat的内容,发现该tomcat引用的为1.7的jdk,更换后,该错误消失。因此,请注意各个环节请尽量保持一致的环境。
2、 The Apache Tomcat Native library which allows optimal performance in production
environments was not found on the java.library.path Tomcat所需支持问题,这里需要一个支持文件tcnative-1.dll,请移步到
http://tomcat.heanet.ie/native/,下载一个比较新一些的版本,该文件在binaries/win32(或win64),然后将其放到自己%JAVA_HOME%/bin文件夹中。放置后重新打包部署tomcat,启动。
3、An incompatible version 1.1.14 of the APR based Apache Tomcat Native library is inst
alled, while Tomcat requires version 1.1.30 这里紧跟2问题,放入该文件后,又因为版本问题提示错误。这里因为下载的tcnative-1.dll与所需版本不一致,因此需要更正。我们将下载的版本放入一份到%JAVA_HOME%/bin中,并放一份到%CATALINA_HOME%/bin中,如果有旧的版本,直接覆盖或以旧的版本为主,替换之前2个目录里的该文件,我们只保持其一致即可。
4、org.apache.jasper.JasperException: javax.servlet.ServletException:
java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.17, required by MATLAB Builder JA, on java.library.path.
This library is typically installed along with MATLAB or the MCR, its absence may indicate an issue with that installation or the current path configuration.
The MCR version that this component is trying to use is: 7.17.
根据下面提示的这段内容,大概说的是我安装的matlab或者MCR配置有问题。那么我们关注点应该在环境配置上,笔者在windows和linux上均遇到该问题,附上2种解决。
Windows:
找到环境变量Path,确保JDK、MCR、Matlab在其中的配置前后顺序,请按照JDK、MCR、Matlab这样的顺序,例如:%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;F:\\Program Files\\MATLAB\\MATLAB Compiler Runtime\\v714\\runtime\\win32;F:\\Program Files\\MATLAB\\R2012a\\runtime\\win32;F:\\Program Files\\MATLAB\\R2012a\\bin
Linux:
请找到etc/profile,编辑该文件,加入Path配置。
如MCR路径为:MCR_HOME=/sur/local/MATLAB/MATLAB Compiler Runtime export PATH=$PATH:$MCR_HOME/v717/runtime/glnx86
同时,请检查一下在安装MCR时设置的LD_LIBRARY_PATH和XAPPLRESDIR。 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
$MCR_HOME/v717/runtime/glnx86:$MCR_HOME/v717/sys/os/glnx86:$MCR_HOME/v717/sys/java/jre/glnx86/jre/lib/i386/native_threads:$MCR_HOME/v717/sys/java/jre/glnx86/jre/lib/i386/server:$MCR_HOME/v717/sys/java/jre/glnx86/jre/lib/i386
export XAPPLRESDIR=$MCR_HOME/v717/X11/app-defaults
配置的内容根据每个人的系统位数不同,飘红部分可能变更,注意查看。
5、Exception in thread \"main\" java.lang.UnsatisfiedLinkError: Failed to find the library mclmcrrt7_17.dll, required by MATLAB Builder JA, on java.library.path.
This library is typically installed along with MATLAB or the MCR, its absence may indicate an issue with that installation or the current path configuration. The MCR version that this component is trying to use is: 7.17.
这个问题与4中的类似,但注意看是因为找不到库文件mclmcrrt7_17.dll引起的,该文件在Matlab和MCR中都有,在文件主目录runtim/win32(win64)中,优先使用MCR的该文件。将其复制一份到c:/windows/system32中,如果是64位系统还应复制到C:\\Windows\\SysWOW64
6、主要环境问题均在以上都可以解决了,除此之外的其他问题,例如
javax.servlet.ServletException:java.lang.NoClassDefoundError:Could not initialize class com.mathworks.toolbox…..
这些找不到对象的请注意将这些提示找不到的对象引入到JSP页面中,方便自己调用。当然了,有功夫的可以去使用框架,就避免了这类问题,直接通过框架获取返回值。
Linux安装MATLAB Compiler Runtime操作:
1、 准备好安装文件,应该与制作算法包的程序版本一致,本文将其放在tmp文件夹下。 2、 进入目录:cd /tmp
3、 解压缩:unzip MCR_R2012a_glnx32_installer.zip -d
MCR_R2012a_glnx32_installer
4、 进入子目录:cd MCR_R2012a_glnx32_installer 5、 安装:./install -mode silent -agreeToLicense yes 6、 当出现下面的字样的时候,就表示MCR安装成功了:
Exiting with status 0 End – Successful. Finished
7、 配置MCR环境变量:
在/etc/profile文件的最后添加如下几行环境变量(如果安装的MCR版本不一样的话,路径可能会有不同,需要注意修改):
export MCR_HOME=/usr/local/MATLAB/MATLAB_Compiler_Runtime export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
$MCR_HOME/v717/runtime/glnx86:$MCR_HOME/v717/sys/os/glnx86:$MCR_HOME/v717/sys/java/jre/glnx86/jre/lib/i386/native_threads:$MCR_HOME/v717/sys/java/jre/glnx86/jre/lib/i386/server:$MCR_HOME/v717/sys/java/jre/glnx86/jre/lib/i386
export XAPPLRESDIR=$MCR_HOME/v717/X11/app-defaults 然后执行下面的命令使之生效: source /etc/profile
8、 执行运行项目包指令: java –jar xxxx.jar 9、完成
可能会遇到的问题:
因篇幅问题不能全部显示,请点此查看更多更全内容