更新jar清单文件 - java.io.IOException:清单格式无效

时间:2014-01-19 21:38:55

标签: java eclipse jar manifest

我需要更新我在Eclipse中创建(导出)的jar文件中的清单。我试图按照this解释但没有成功。我不太确定在命令行上指定什么。 Oracle网站不太清楚。然后我在SO上发现了一个帖子,它说从jar存档中提取manifest.mf文件,更新它,并将其添加回jar存档。我也尝试了,但它似乎有效,但是,在运行时,我得到java.io.IOException: invalid manifest format。更新 manifest.mf 以添加新属性的正确方法是什么?一个例子是最有帮助的。

5 个答案:

答案 0 :(得分:4)

由于清单文件包含在名为MANIFEST.MF的jar文件的META-INF子目录中。无论何时通过命令为命令提示符创建jar文件 jar cvf Jarfilename FilesToadd 然后创建默认清单文件。 可以查看此文件并了解有效的Manifestfile。 为了从cmd中的jar类型跟随命令中提取清单文件 jar xvf Jarfilename 现在META-INF子目录将出现在基本目录中,您可以在此处查看默认清单文件。 有时在更新清单文件时,我们会收到 java.io.IOException:清单格式无效。由于以下原因导致此错误:

1.您可能没有在清单文件中任何部分的名称和值之间留出空格,
比如版本:1.1 是inavalid部分而不是写版本:1.1 冒号和1.1之间的空间真的很重要。

2.指定主类时,您可能在类名末尾添加了.class扩展名。通过键入 Main-Class:Classname 来指定主类。

3.您可能没有在文件末尾添加换行符。您无需编写\ n来指定换行符,只需将清单文件的最后一行留空即可实现此目的

4.您的清单文本文件必须使用 UTF-8 编码,否则可能会遇到麻烦。

最后,我提供了一个清单文件必须是什么样子的示例。 这里的包是计算器,主类是Calculator.java

清单 - 版本:2.1

Created-By:UselessCoder

包名:计算器

类名:calculator.Calculator.java

Main-Class:calculator.Calculator

答案 1 :(得分:2)

彼得提供的链接部分有用。但是,我能够通过反复试验来或多或少地解决这个问题。解释如何执行此操作的Oracle文档需要大量工作。他们缺乏一个如何进行的好例子。无论如何,对于那些遇到同样问题的人来说,这就是我所做的。我使用记事本创建了一个文本文件(例如“Manifest.txt”),其中包含我想要添加/更新的清单属性。在创建此文件时,我确保通过按键盘上的键将新行字符添加到最后一行。接下来,我创建了一个DOS bat文件来进行实际修改。这就是它的样子......

echo Updating manifest permissions...
"C:\Program Files\Java\jdk1.7.0_25\bin\jar" -umf "c:\some folder\Manifest.txt" "C:\some folder\jartoupdate.jar"

jar参数的顺序与命令行后面的实际路径相关是很重要的。彼得的回复链接指出了这一点。

答案 2 :(得分:0)

修改jar的内容时,你应该更多地看看这个方向:
http://docs.oracle.com/javase/tutorial/deployment/jar/update.html,尤其是 http://docs.oracle.com/javase/tutorial/deployment/jar/modman.html描述了更新清单的过程。

答案 3 :(得分:0)

要更新jar文件中的清单,您在oracle文档中找到了答案。这是另一个看到答案的地方。假设您具有对安装JDK的目录的读取权限,并且随之下载了文档(易于下载文档,这适用于SE7 http://www.oracle.com/technetwork/java/javase/documentation/java-se-7-doc-download-435117.html):

  1. 转到 [install_directory] ​​/ docs 。在那里有一个 index.html 文件。
    >>>>例如我的JDK 6被称为 C:\ my_TOOLS \ Java_stuff \ jdk_1.6.0_20 \ docs \ index.html

  2. index.html 拖到浏览器页面上。

  3. 该页面显示了JDK文档的概述,并提供了许多有用信息的链接。 JDK 6 在Java语言行下方的顶部框行中,单击JAR。它将带您进入总结jartool文档(带链接)的页面。
    在" JAR工具"该页面的一部分,单击您平台的参考页面链接(您可能需要" Windows的JAR工具参考页面")。

  4. 那个" JAR工具参考页"显示jar命令的详细文档。在这里您可以看到示例" jar umf Manifest.txt my_jar.jar "。 (Solaris / Linux不会在" umf"。

  5. 之类的args前使用" - "


    我用它(在Linux上)将2个自定义Manifest文件合并到默认Manifest并将其放入我的jar中。我分两个步骤完成,但有兴趣知道执行此操作的一步命令。 (对jar命令使用两个m会导致第二个清单覆盖第一个清单 - 未合并。)(请记住每个清单文件必须以空行结束。)

    Manifest.txt 包含"姓名:"和"实施 - 版本:"
    Manifest.my_app.txt 包含" Main-Class:"和" Class-Path:"
    默认清单包含"清单 - 版本:"和"创建者:"

    jar cmf my_app.jar Manifest.txt my_main.class my_utils.class
    jar umf Manifest.my_app.txt my_app.jar 
    

    之后,我的 META-INF / MANIFEST.MF 包含所有3个清单中的所有字段。我希望它们可以相互附加,但是这些字段混杂在一起。也许有人可以告诉他们如何订购或直接追加。这是它们出现在我当前的 META-INF / MANIFEST.MF 中的顺序。

    Manifest-Version: 1.0
    Implementation-Title: my_app
    Implementation-Version: 1.2.1
    Class-Path: ...
    Name: My App
    Created-By: 1.6.0_20 (Oracle Corporation)
    Main-Class: My_App
    

    我希望其中一些对你有用。

答案 4 :(得分:0)

java.io.IOException:清单格式无效时也会引发错误

  

清单文件中存在不需要的空行。

例如:

之前 manifest.txt

Manifest-Version: 1.0

Main-Class: Sample

之后 manifest.txt

Manifest-Version: 1.0
Main-Class: Sample