从动态Java类路径导入Java类时出现Matlab编译器MCC错误
如何让从动态Java类路径导入Java类时出现Matlab编译器MCC错误,java,matlab,classpath,matlab-deployment,mcc,Java,Matlab,Classpath,Matlab Deployment,Mcc,如何让mcc识别来自用户提供的Java库的导入,或者干脆忽略无法解析的导入 我有一个Matlab代码库,我正在用Matlab编译器构建,但是构建正在中断,因为当遇到Matlab动态类路径上JAR中Java类的import语句时,mcc出错。我使用mcc-a选项包括类路径上的所有JAR文件。代码在IDE中工作,我认为它将在部署的应用程序中工作,如果它只允许我构建。(在R2009b下工作,在非MCOS类中忽略这些导入。) 这里有一个简单的复制。该文件与Google guava中的guava-11.0
mcc
识别来自用户提供的Java库的导入,或者干脆忽略无法解析的导入
我有一个Matlab代码库,我正在用Matlab编译器构建,但是构建正在中断,因为当遇到Matlab动态类路径上JAR中Java类的import
语句时,mcc
出错。我使用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
如何利用它。)
这是在Windows上的MatlabR2011B中
我的环境背景。我的应用程序在动态类路径上有大约40个JAR,它们是第三方库和我们自己的Java代码的混合体。在单用户和多用户Windows机器上,它部署到50多个用户。还有其他一些团体可能正在向相同的用户和机器部署其他MCR应用程序。在任何机器上,相同或不同的用户可以同时运行不同的MCR应用程序。我们每周发布一次,并且(主要是由于我们自己的Java代码中的更改)至少有一个JAR文件会在其他版本中更改。我需要一个在这种环境下工作的机制
有什么建议吗?有谁知道一个好方法,可以让
mcc
在编译步骤中向其java类路径添加内容,或者忽略虚假的导入?我的后备计划是遍历代码库并删除Java类的所有导入,这是一种痛苦
2012年12月2日更新:我从MathWorks听说这在MatlabR2012B中是固定的。(但我不再使用Matlab,因此无法亲自验证。)
2014年9月12日更新:我再次使用Matlab(R2014b),Matlab编译器现在包括编译程序动态类路径中动态类路径上的JAR。不过,它似乎不会自动将JAR文件包含在归档文件中;您必须使用
mcc
命令行开关手动包含它们,或将它们作为“附加包含文件”添加到Matlab编译器应用程序中。以下是该链接的摘录
MATLAB为Java类维护一个独立于搜索路径的路径。这意味着,即使MATLAB路径上有一个.class或.jar文件,除非使用javaaddpath,否则将无法使用它。要查看当前路径上的内容,请使用javaclasspath。运行这个命令,您将看到一长串matlab附带的文件,称为静态类路径,然后您将看到动态类路径。动态类路径是使用javaaddpath添加到路径中的类的放置位置。它们可以用javarmpath删除,并且必须主动重新加载matlab的每个会话。MatlabIDE中执行的代码可以工作,因为guava jar文件已经通过javaaddpath方法添加到“动态”类路径中。但是,当您使用MCC调用MATLAB编译器时,它不依赖于动态java类路径,而是依赖于“静态”java类路径,定义于: $MATLABROOT/toolbox/local/classpath.txt 如果在这里为JAR文件添加一个条目,那么MCC将能够解析M文件中的导入行 所以为了测试这一点,我下载了GuavaJAR文件并尝试了上述步骤。工作起来很有魅力。 此外,如果您阅读了MATLAB编译器的“疑难解答”部分,则会记录这种确切情况: 引用链接:“import语句引用的是一个Java类(),MATLAB编译器(如果错误发生在编译时)或MCR(如果错误发生在运行时)找不到该类
要解决此问题,请确保包含Java类的JAR文件存储在Java类路径上的文件夹中。(请参阅matlabroot/toolbox/local/classpath.txt了解类路径)。如果错误发生在运行时,则在开发机器上运行时,类路径存储在matlabroot/toolbox/local/classpath.txt中。”您只需将导入语句放在一个单独的.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...
然后它将编译并运行。无需乱弄系统范围的类路径。本文档仅指Matlab本身,而非
mcc
。这就是我在Matlab的类路径上获取JAR的方法。但是我需要mcc
,就像Matlab中所说的那样,也要尊重它。@AndrewJanke mcc只尊重静态类路径,而不尊重动态类路径(使用javaaddpath修改),请参见上面的回答。+1让最终用户修改系统库对于广泛部署来说不是一个可接受的解决方案。他们不一定拥有这样做的技术诀窍或文件权限,不同的程序可能使用不同的库集和版本,这会增加环境的差异。但看起来你对这里有些了解。我将尝试在构建环境中修改静态类路径文件足够长的时间,以使其与导入一起编译,然后看看它是否会在部署的MCR应用程序的运行时将JAR拉到动态类路径上。@AndrewJanke,好吧,如果你给他们编译的应用程序,他们无论如何都必须安装MCR,对吗?所以我觉得权限没什么大不了的。至于最终用户的技术诀窍,您可以编写一个小实用程序来执行一些后期设置,比如shell
javaaddpath 'c:\some.jar';
do_imports
...interesting stuff...