【问题标题】:JAR Command not using supplied ManifestJAR 命令未使用提供的清单
【发布时间】:2022-01-15 04:36:37
【问题描述】:

不确定为什么我会收到此错误,我觉得我错过了一些非常简单的东西。这是我在尝试关注this 从命令行创建 JAR 可执行文件时遇到的问题。这是我的简单测试文件:

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 命令的使用在哪里不正确?为什么它无法识别我提供的清单文件?

谢谢!

【问题讨论】:

  • 很难追溯您的问题,因为我们的系统中可能不存在任何问题的原因,或者我们可能会无意识地避免。您可以使用v 选项获得更多诊断输出。请注意,仅设置主类,您根本不需要处理清单。您可以使用 jar cfe JarExample.jar JarExample *.classentry 点又名主类设置为 JarExample。并使用 jar vcfe JarExample.jar JarExample *.class 获取 verbose 输出。
  • 这个链接应该有帮助 -> link

标签: java manifest executable-jar


【解决方案1】:

我已按照您描述的所有步骤操作,并且已成功创建可执行的 jar 文件。

我正在使用openjdk 11.0.11 2021-04-20

.jar 文件中生成的文件如下所示:

Manifest-Version: 1.0
Main-Class: JarExample
Created-By: 11.0.11 (Ubuntu)

所以这可能是由您的 Java 版本或使用的操作系统引起的。

在你回答的引用中,有a useful comment by David

如果您创建 MANIFEST.MF 文件,不要忘记完成最后一行 带有换行符。 在 Windows 上,只需在末尾添加一个空行。 否则最后一个属性不会出现在 jar 文件中。在这个 特殊情况 Main-Class 属性将丢失。

可能,这就是你的情况。因为当我删除 MANIFEST.MF 中的最后一个换行符时,我得到了和你一样的错误:

没有主要清单属性,在 JarExample.jar 中

MANIFEST.MF 的最后一个换行符的示例(第 3 行为空) - 效果很好

Manifest-Version: 1.0
Main-Class: JarExample

没有最后一个换行符(2 行代码) - 崩溃并出现错误

Manifest-Version: 1.0
Main-Class: JarExample

【讨论】:

  • 啊,没错!我错过了那个评论。多么奇怪的要求。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 2014-09-14
  • 2012-01-17
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多