如何mcc
识别来自用户提供的 Java 库的导入,或者简单地忽略无法解析的导入?
我有一个使用 Matlab 编译器构建的 Matlab 代码库,但是构建正在中断,因为mcc
当它遇到import
在 Matlab 的动态类路径上的 JAR 中的 Java 类的语句时出错。我在类路径中包含所有 JAR 文件和mcc -a
选项。该代码在 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 类的所有导入,这有点痛苦。
2012 年 12 月 2 日更新:我从 MathWorks 听说这已在 Matlab R2012b 中修复。(但我不再使用 Matlab,所以无法亲自验证。)
更新 12/09/2014:我再次使用 Matlab (R2014b),Matlab 编译器现在包括已编译程序的动态类路径中动态类路径上的 JAR。不过,它似乎不会自动将 JAR 文件包含在存档中。您必须使用mcc
命令行开关手动包含它们,或者在 Matlab 编译器应用程序中将它们添加为“附加包含的文件”。