从动态Java类路径导入Java类的Matlab编译器MCC错误

时间:2012-02-09 23:37:21

标签: java matlab classpath matlab-deployment mcc

如何让mcc识别来自用户提供的Java库的导入,或者只是忽略无法解析的导入?

我有一个Matlab代码库,我正在使用Matlab编译器构建,但由于mcc在遇到Matlab的JAR中的Java类的import语句时出错,所以构建失败了动态类路径。我使用mcc -a选项将所有JAR文件包含在类路径中。代码在IDE中工作,我认为它将在已部署的应用程序中工作,如果它只允许我构建。 (在R2009b下工作,忽略非MCOS类中的这些导入。)

这是一个简单的复制品。该文件与Google Guava中的guava-11.0.1.jar位于同一目录中。

%file hello_world_with_import.m
function hello_world_with_import
import com.google.common.base.Stopwatch;
disp('Hello, world!');
end

在Matlab中运行它可以正常工作。但建设失败了。 (这里的javaaddpath并不是绝对必要的,因为糟糕的导入本身并不是普通Matlab中的错误。只是展示它在实践中是如何工作的,以及我希望mcc如何选择它。)

>> javaaddpath('guava-11.0.1.jar');
>> hello_world_with_import()
Hello, world!
>> mcc -m -a guava-11.0.1.jar hello_world_with_import
Error: File: C:\Temp\import_test\hello_world_with_import.m Line: 3 Column: 8 
Arguments to IMPORT must either end with ".*" 
 or else specify a fully qualified class name: "com.google.common.base.Stopwatch" fails this test. 
Unable to determine function name or input/output argument count for function  
in MATLAB file "hello_world_with_import".  
Please use MLINT to determine if this file contains errors. 
Error using mcc
Error executing mcc, return status = 1 (0x1).

这是在Windows上的Matlab R2011b中。


我环境的一些背景知识。我的应用程序在动态类路径上有大约40个JAR,它们是第三方库和我们自己的Java代码的混合。它在单用户和多用户Windows机器的混合上部署到50多个用户。还有其他组可能正在将其他MCR应用程序部署到同一用户和计算机。在任何计算机上,不同的MCR应用程序可以由相同或不同的用户同时运行。我们每周发布一次,并且(主要是因为我们自己的Java代码发生了变化)至少有一个JAR文件在每个其他版本上发生变化。我需要一种可以在这种环境中工作的机制。


有什么建议吗?有人知道在编译步骤中让mcc在java类路径中添加东西的好方法,或者只是忽略伪造的导入?我的后备计划是通过代码库并删除Java类的所有导入,这是一种痛苦。


更新12/2/2012:我从MathWorks获悉,这在Matlab R2012b中得到了修复。 (但我不再使用Matlab,因此无法亲自验证它。)

更新12/09/2014:我再次使用Matlab(R2014b),Matlab编译器现在包含了编译程序动态类路径中动态类路径上的JAR。但是,它似乎不会自动将JAR文件包含在存档中;您必须使用mcc命令行开关手动包含它们,或者在Matlab编译器应用程序中将它们添加为“其他包含文件”。

3 个答案:

答案 0 :(得分:4)

在MATLAB IDE中执行的代码可以工作,因为guava jar文件已被添加到" dynamic" classpath通过javaaddpath方法。但是,当您使用MCC调用MATLAB编译器时,它不依赖于动态java类路径,而是依赖于"静态" java classpath ,定义于:

<强> $ MATLABROOT /工具箱/本地/ classpath.txt

如果您在此处为JAR文件添加条目,则MCC将能够解析您的M-File中的IMPORT行。

所以测试一下,我下载了guava jar文件并尝试了上面的步骤。像魅力一样。

此外,如果您阅读&#34;故障排除&#34;在MATLAB编译器的部分中,记录了这种确切的情况:

http://www.mathworks.com/help/toolbox/compiler/brtm1xm-8.html

从链接引用:&#34; import语句引用了一个Java类(),MATLAB编译器(如果在编译时发生错误)或MCR(如果在运行时发生错误)找不到。

要解决此问题,请确保包含Java类的JAR文件存储在Java类路径上的文件夹中。 (有关类路径,请参阅matlabroot / toolbox / local / classpath.txt。)如果错误发生在运行时,则在开发计算机上运行时,类路径将存储在matlabroot / toolbox / local / classpath.txt中。&#34;

答案 1 :(得分:1)

您只需将import语句放在单独的.m文件中即可。

所以来自:

javaaddpath 'c:\some.jar';
import com.something.Element;
...interesting stuff...

将会有一个do_imports.m:

import com.something.Element;

原来.m:

javaaddpath 'c:\some.jar';
do_imports
...interesting stuff...

然后它将编译并工作。无需乱搞系统级类路径。

答案 2 :(得分:-1)

以下是链接的摘录 http://blogs.mathworks.com/desktop/2009/07/06/calling-java-from-matlab/

MATLAB维护一个与搜索路径分开的Java类路径。这意味着即使您在MATLAB路径上有.class或.jar文件,除非您使用javaaddpath,否则您将无法使用它。要查看当前路径上的内容,请使用javaclasspath。运行此命令,您将显示matlab附带的一长串文件,称为静态类路径,然后您将看到动态类路径。动态类路径是将放置添加到具有javaaddpath的路径的类的位置。可以使用javarmpath删除它们,并且必须主动重新加载每个matlab会话。