【问题标题】:"Could find or load main class" while running executable jar file in Java code在 Java 代码中运行可执行 jar 文件时“可以找到或加载主类”
【发布时间】:2020-12-11 18:26:48
【问题描述】:

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

Could find or load main class combine.class" 导致 by: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 文件后它没有运行并出现上述错误。

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

【问题讨论】:

  • 类路径中有你自己的 jar 吗?另外请添加您正在使用的完整命令行。
  • 最简单的解决方案,制作一个可运行的 jar(它将包含所需的一切)。问题是您的 jar 不包含这些库
  • echo Main-Class: Combine.class > manifest.txt jar cmf manifest.txt FinalExecutable.jar Combine.class 我正在使用这些命令转换成可执行文件
  • 你是如何构建你的 JAR 的?
  • 另外:别忘了把类的全名,即如果有包的话放在包里

标签: java


【解决方案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 完全限定的类名,而不是文件名或文件路径名。

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

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

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 2016-02-16
    • 2018-11-17
    • 2020-02-18
    • 1970-01-01
    • 2019-02-21
    • 2014-09-04
    • 2018-12-16
    • 2020-06-02
    相关资源
    最近更新 更多