这个问题困扰了我将近一周的时间,网上也搜索了各种解决办法,最后还是在一位好心人的帮助下解决了,很有感触,写个总结。
- 多思考为什么。
- 别人的解决方式只能作为参考。
简述
很简单,我的系统的ubuntu10.10(这也是出问题的关键,windows下是没有问题的,但是由于工程必须跑在ubuntu下,所以,也没有办法)。用java去调用matlab,matlab采用deploytool打包成jar,然后将新生成的jar包和javabuilder.jar放到WEB工程里面去。工程里调用matlab函数。上面的在windows里没有出问题,运行的很好,但是将所有的,包括Myeclipse和MATLAB都是ubuntu下安装的,就有问题了
出现的问题是:
Exception in thread "b7a81f0f-d7c9-491a-bbbb-5e0144c94203" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.16, 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.16.
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.get(MCRConfiguration.java:167)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ProxyLibraryDir.<clinit>(MCRConfiguration.java:173)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getProxyLibraryDir(MCRConfiguration.java:178)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.get(MCRConfiguration.java:77)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$MCRRoot.<clinit>(MCRConfiguration.java:87)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:92)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.<clinit>(MCRConfiguration.java:66)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:71)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1466)
at bq.BqMCRFactory.newInstance(BqMCRFactory.java:54)
at bq.BqMCRFactory.newInstance(BqMCRFactory.java:65)
at bq.bq.<init>(bq.java:98)
at actual_qa.action.MitiSay.run(MitiSay.java:60)
很明显是找不到动态库libmwmclmcrrt.so.7.16
网上的一般解决办法:
- 在ubuntu下添加LD_LIBRARY_PATH。添加方法:sudo gedit /etc/environment . 打开的文件里输入:LD_LIBRARY_PATH=“你的路径”,然后保存关闭,使用source /etc/environemnt 立即生效。注意:这里虽然是立即生效,但是只是一个终端下生效,一旦新打开一个终端,输入echo $LD_LIBRARY_PATH,又会看到不存在那个路径。有效的生效方式是重新启动ubuntu。
相关知识:
ubuntu下环境变量的修改方式和区别:
shell是什么:
- 将你找不到的文件,复制到/usr/local或者其他java.library.path路径下。
- 将工程改为在LD_LIBRARY_PATH环境变量下运行。方法:RUN AS->RUN Configurations—>environemnt->添加LD_LIBRARY_PATH,value是你的路径。采用java进行调试运行的时候,能够成功,但是一旦使用tomcat运行,就有报最初的错了。
我最后的初步解决办法是(未完全成功):
- 在java里面动态添加java.library.path。
- //1,修改我当前的java.library.path
String m = System.getProperty("java.library.path"); //usr/local/lib
System.out.println("修改前的"+m);
try {
System.setProperty("java.library.path", System.getProperty("java.library.path")
+ ":/usr/local/MATLAB/R2011b/bin/glnx86/");
} catch (Exception e) {
// do nothing for exception
}
String m1 = System.getProperty("java.library.path"); //usr/local/lib
System.out.println("修改后的"+m1);
不动态添加java.library.path时,java.library.path为
- /home/jdk1.6.0_21/jre/lib/i386/server:
- /home/jdk1.6.0_21/jre/lib/i386:
- /home/jdk1.6.0_21/jre/../lib/i386:
- /usr/local/MATLAB/R2011b/bin/glnxa64:(此处有错)(这是我catalina.sh里面添加的)
- /usr/java/packages/lib/i386:
- /lib:
- /usr/lib
添加java.library.path后:
添加前:
- /home/jdk1.6.0_21/bin:
- /usr/local/apache-tomcat-6.0.30/bin:
- /usr/local/MATLAB/R2011b/bin/glnx86/
添加后:
- /home/jdk1.6.0_21/bin:
- /usr/local/apache-tomcat-6.0.30/bin:
- /usr/local/MATLAB/R2011b/bin/glnx86/:
- /usr/local/MATLAB/R2011b/bin/glnx86/
同时:LD_LIBRARY_PATH是null
最最后,动态修改java.library.path的方法,不可行,因为tomcat在第一次运行的时候,就确定了自己的动态链接库,具体设置在catalina.sh文件里,想要添加的话,可以添加LD_LIBRARY_PATH就ok。
解决办法也就是在catalina.sh里添加LD_LIBRARY_PATH,然后运行,获得java.library.path发现里面有了我添加的路径。然后就不会报错了。
但是,具体tomcat在加载动态库时,顺序是怎样的呢?(待解)
补充:matlab打包成jar时,是否需要添加MCR的问题。
- MCR(matlab compiler runtime)就相当于matlab代码解析器,如果你打包时,不添加MCR,那么你运行jar的机器上必须安装有MCR,否则代码将无法被解析;或者你的电脑上安装有MATLAB也是一样的。如果你将MCR一同打包在jar里,那个你拷贝到目标电脑上时,就需要jar和MCR,且目标电脑上没有相应版本的MATLAB或MCR时,就需要将包里的MCR安装到你的目标机器上。