使用Java代码运行可执行jar文件时出现问题

时间:2019-01-29 13:09:32

标签: java

在Windows 10中使用命令提示符中的命令将Java程序转换为可执行jar文件后,执行jar文件时出现错误:

  

可能找到或加载主类Combine.class”   作者:java.lang.ClassNotFoundException:Combine.class

我的jdk-11.0.1具有javamail api和excelapi。执行时,我将类路径设置为:

classpath=%classpath%;C:\Program Files\Java\jdk-11.0.1\javamail_api\javax.mail-1.6.2.jar;C:\Program Files\Java\jdk-11.0.1\javamail_api\activation.jar;C:\Program Files\Java\jdk-11.0.1\jexcelapi\jxl.jar;.;

它正在正确编译和执行,但是在转换为可执行jar文件后,它没有运行并给出了以上错误。

任何帮助将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:1)

线索在异常消息中。它正在尝试加载名称为Combine.class的类。但是类的真实名称是Combine

您创建的JAR文件不正确。

 echo Main-Class: Combine.class > manifest.txt 
 jar cmf manifest.txt FinalExecutable.jar Combine.class 

如果Combine位于默认软件包中(即它没有package语句),则以上内容应为:

 echo Main-Class: Combine > manifest.txt 
 jar cmf manifest.txt FinalExecutable.jar Combine.class 

如果在包Combine中声明了foo.bar,则上面的应该是。

 echo Main-Class: foo.bar.Combine > manifest.txt 
 jar cmf manifest.txt FinalExecutable.jar foo/bar/Combine.class

,您需要位于foo目录上方的目录中。

注意:清单中的“ Main-Class”属性必须是Java完全限定的类名,而不是文件名或文件路径名。

还应注意,当您使用CLASSPATH运行JAR时,将忽略-cp环境变量和java -jar ...参数。如果您的可执行JAR依赖于其他JAR文件,则应将它们组合(以创建阴影JAR),或者应在清单中添加“ Class-Path”属性;参见https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

最后,我的建议是使用构建工具(例如Maven)来编译代码,创建可执行JAR文件等,而不是手工完成。

答案 1 :(得分:-1)

您的应用程序变成了“可执行jar”,因为您提到了META-INF / MANIFEST中的主类。双击该罐子即可模拟

java -jar <your jarfile>

这将解决

java -cp <your jarfile> <main class from manifest>

但是,除非您创建一个包含代码以及所有依赖项的uber-jar,否则您仍然必须在类路径上声明所有其他依赖项。

不是您所喜欢的吗?尝试构建Error only with maven: NoClassDefFoundError: feign/codec/Encoder

中提到的jar
相关问题