首页 > 解决方案 > 在 Java 代码中运行可执行 jar 文件时“可以找到或加载主类”

问题描述

在 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 文件后它没有运行并给出上述错误。

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

标签: java

解决方案


线索在异常消息中。它正在尝试加载一个名为 的类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在 package 中声明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-cp您使用java -jar .... 如果您的可执行 JAR 依赖于其他 JAR 文件,您应该将它们组合起来(以创建阴影 JAR),或者您应该在清单中添加“Class-Path”属性;请参阅https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

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


推荐阅读