在 Matlab R2014b、JRE 9 下,遵循 this 等几个示例后,我可以成功调用给定的 JAR,但无法使用我自己编译的 JAR。
对于这个HelloWorld.java
:
public class HelloWorld{
public HelloWorld(){
System.out.println("Constructor");
}
public static void main(String[] args){
System.out.println("Hello World!");
}
}
Matlab R2014 使用 Java RE 1.7。如果我为 JRE 1.7 构建代码(在 Eclipse 中,使用选项“属性”>“Java 编译器”>“编译器合规性级别”> 1.7),则导出的 JAR 工作正常:
>> javaaddpath('HelloWorld.2.jar')
>> HelloWorld
HelloWorld@4492d317
但是如果我尝试自己的任何命令,生成的 JAR 在 Matlab 中会失败:
>> !javac -source 1.7 -target 1.7 HelloWorld.java
>> !javac -source 1.7 -target 1.7 -bootclasspath [Path to Matlab RT\]rt.jar HelloWorld.java
>> !jar cf HelloWorld1.jar HelloWorld.class
>> !jar cfe HelloWorld1.jar HelloWorld HelloWorld.class
>> javaaddpath('HelloWorld1.jar')
>> HelloWorld
Undefined function or variable 'HelloWorld'.
我应该使用哪些命令行来编译自己的 JAR 文件以便在 Matlab 中运行?
最佳答案
由于当您通过 Eclipse
生成 jar
时它可以工作,但当您从 Matlab
尝试时它却不起作用,所以我最好的选择是jar
的入口点名称(即 HelloWorld)未在 list 文件中正确设置。如果您在从 Matlab
编译时使用 .java
和 .class
文件的完整路径,那么这可能是罪魁祸首。您可以使用 jar tf 工具
验证两个 jar
(即 HelloWorld1.jar
和 HelloWorld2.jar
)内的内容。因此,在 HelloWorld1.jar
和 HelloWorld2.jar
上使用 jar tf
,您应该会看到类似的差异
For HelloWorld2.jar you should see
META-INF/
META-INF/MANIFEST.
HelloWorld.class
For HelloWorld1.jar you probably would see
META-INF/
META-INF/MANIFEST.
<some_path>/HelloWorld.class <- this is the problem
要解决此问题,您可以使用以下步骤。在 Matlab
shell
1. Change directory to the location of HelloWorld.java
>> cd 'path_to_hello_world.java'
2. Compile the code with the default bootclass
>> !javac -source 1.7 -target 1.7 HelloWorld.java
3. Jar the file using HelloWorld as your entry point
>> !jar cfe HelloWorld1.jar HelloWorld HelloWorld.class
4. Test
>> !java -jar HelloWorld1.jar % you should see Hello World!
如果步骤 4 有效,javaaddpath
现在应该可以工作。
关于java - Matlab - 如何编译 JAR 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51527027/