java - 在 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 文件后它没有运行并给出上述错误。
任何帮助,将不胜感激。谢谢
解决方案
线索在异常消息中。它正在尝试加载一个名为 的类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 文件等,而不是手动进行。
推荐阅读
- c# - 如何正确使用 int 更改 Unity 中的文本
- python - 如何使 satusbar 仅适用于特定状态(Odoo13)
- android - Flutter Row() - 均匀对齐 3 个小部件
- java - java swing手动启动一个没有用户输入的事件
- python - 在谷歌 colab 中使用 argparse。不使用文件夹名称“gdrive/My Drive/”中的空间
- python - 如何使用 LeaveOneOut 解决 TypeError
- json - Swift - 如何使用可编码的嵌套数组的 JSON 进行 JSONDecode(其中没有键或名称的数组,根据给出的示例)
- laravel - 如何将 react-native-audio-record 录制的音频文件发送到服务器?
- python - 如何隔离打印输出中的第四行?
- javascript - 转换 Scratch 颜色