不确定为什么会出现此错误,我觉得我错过了一些非常简单的东西。这是我在尝试遵循有关从命令行创建 JAR 可执行文件的this帖子时遇到的问题。这是我的简单测试文件:
JarExample.java:
public class JarExample {
public static void main(String[] args) {
}
}
清单.MF:
Manifest-Version: 1.0
Main-Class: JarExample
我运行以下命令来构建 JAR:
javac JarExample.java
jar cfm JarExample.jar MANIFEST.MF *.class
但是当我运行
java -jar JarExample.jar
时,我收到以下错误:
no main manifest attribute, in JarExample.jar
在 JAR 内部达到峰值,存在正确的类文件,但存在以下自动生成的清单
META-INF/MANIFEST.MF
:
Manifest-Version: 1.0
Created-By: 1.8.0_162 (Oracle Corporation)
那么我对
jar
命令的使用哪里不正确?为什么它无法识别我提供的清单文件?
谢谢!
我已按照您描述的所有步骤进行操作,并且已成功创建可执行 jar 文件。
我正在使用
openjdk 11.0.11 2021-04-20
.jar 文件内生成的文件如下所示:
Manifest-Version: 1.0
Main-Class: JarExample
Created-By: 11.0.11 (Ubuntu)
所以这可能是由您的Java版本或使用的操作系统引起的。
在您引用的答案中,有David 的有用评论:
如果您创建 MANIFEST.MF 文件,不要忘记完成最后一行 带有换行符。 在 Windows 上只需在末尾添加一个空行。 否则最后一个属性将不会出现在 jar 文件中。在这个 特殊情况下,Main-Class 属性将会丢失。
这可能就是你的情况。因为当我删除
MANIFEST.MF
中的最后一个换行符时,我得到了与你相同的错误:
JarExample.jar 中没有主要清单属性
带有最后一个换行符的
MANIFEST.MF
示例(第三行为空) - 效果很好
Manifest-Version: 1.0
Main-Class: JarExample
没有最后一个换行符(2行代码) - 因错误而崩溃
Manifest-Version: 1.0
Main-Class: JarExample
我也面临着同样的问题。
我使用的是jar 17。Java版本17.0.0
jar -cvfm <achive-name>.jar manifest.mf <path-to-class-with-main>.class
该工具在 jar 存档中创建 manifest,包含两行:
Manifest-Version: 2.0
Created-By: 17 (Oracle Corporation)
只是fui: 我放置的 manifest.mf 由 3 行组成:
Manifest-Version: 2.0
Created-By: 17 (Oracle Corporation)
Main-Class: study.App
我刚刚改变了方法:
jar cvfe <achive-name>.jar <package.ClassName-with-no-extension> <path-to-class-with-main>.class
所以,这个问题确实存在