【问题标题】:Using jar.exe with manifest file for executable - "no main manifest attribute"将 jar.exe 与清单文件一起用于可执行文件 - “无主清单属性”
【发布时间】:2016-07-15 18:16:15
【问题描述】:

我已经搜索了 Google 和 StackOverflow 以寻求解决方案,但到目前为止没有找到任何解决方案。我正在尝试使用 Java 1.8 的 Windows 命令行中的清单文件生成一个简单的可执行 .jar 包。相关文件为:

Turtlephilia.java:

public class Turtlephilia {
    public static void main(String[] args) {
        System.out.println("i lurrrve turtles");
    }
}

清单.mf:

Main-Class: Turtlephilia

do.bat:

javac Turtlephilia.java

jar cvmf manifest.mf Turtlephilia.jar Turtlephilia.class 

java -jar Turtlephilia.jar

当我执行 do.bat 时,它编译并存档成功,但是在运行 jar 文件时,它会生成此错误:

no main manifest attribute, in Turtlephilia.jar

注意:我实际上可以使用此命令成功运行它:

java -cp Turtlephilia.jar Turtlephilia

但我需要它是一个可执行的 jar。

我做错了什么?有多难!?

【问题讨论】:

  • 您是否碰巧使用记事本创建了 manifest.mf?我怀疑开头有一个不可见的byte-order mark (BOM) 字符,这意味着该行在技术上并不以Main-Class 开头。解决方法:在Main-Class上方添加一个空行。
  • 我确实在记事本中进行了编辑,但添加空行后我遇到了同样的问题。顺便说一句,我注意到,如果我将 .jar 拖到 Netbeans 中并查看,那么在 META-INF\MANIFEST.ms 下的包中,它的默认清单具有 Manifest-Version: 1.0, Created-By: ... .,没有我的 Main-Class 线。它只是完全忽略了我的清单文件吗?
  • 天哪。你走在正确的轨道上。 Main-Class 是清单文件中的最后一行,后面需要一个回车。

标签: java jar executable-jar manifest.mf


【解决方案1】:

嗯,我找到了原因。

我在记事本中创建了 manifest.mf 文件,主类只有一行。

原来在这一行之后需要一个回车来识别它,即。最后一个空行。

我已经为此苦苦挣扎了几个小时,但我并没有被 Java 开发环境所吸引。

【讨论】:

  • 记事本不是源代码编辑器。使用记事本并指责 Java 就像使用 wget 浏览网页并指责 StackOverflow 难以使用一样。
  • 我不同意。无法处理尾随空格的存在/不存在是非常糟糕的,并且在失败时无法生成任何有用的警告加剧了糟糕的情况。无论如何,IDE 是否经常在文本文件中添加尾随空格?我认为不会,那为什么它们会有所不同?
  • 一般情况下我会同意你的看法;程序应该优雅地失败。但是这种优雅是有限制的——你不能指望程序在面对garbage input时总是表现得合理。您的假设虽然合理,但不正确。文本文件 are expected to terminate in a new line (background) 和记事本未能在文件末尾添加新行是其不良行为。
猜你喜欢
  • 2021-11-02
  • 2017-08-18
相关资源
最近更新 更多