JAR 命令不使用提供的清单

问题描述 投票:0回答:2

不确定为什么会出现此错误,我觉得我错过了一些非常简单的东西。这是我在尝试遵循有关从命令行创建 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
命令的使用哪里不正确?为什么它无法识别我提供的清单文件?

谢谢!

java manifest executable-jar
2个回答
3
投票

我已按照您描述的所有步骤进行操作,并且已成功创建可执行 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

0
投票

我也面临着同样的问题。

我使用的是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

所以,这个问题确实存在

© www.soinside.com 2019 - 2024. All rights reserved.