在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文件后,它没有运行并给出了以上错误。
任何帮助将不胜感激。 谢谢
答案 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