IOException:'标题字段无效;使用清单创建.jar文件时

时间:2013-09-20 01:49:26

标签: java command-line

当我在命令提示符下键入jar cvfm file_name.jar manifest.txt * .class时出现此错误:

java.io.IOException: invalid header field
    at java.util.jar.Attributes.read(Attributes.java:410)
    at java.util.jar.Manifest.read(Manifest.java:199)
    at java.util.jar.Manifest.<init>(Manifest.java:69)
    at sun.tools.jar.Main.run(Main.java:172)
    at sun.tools.jar.Main.main(Main.java:1177)

我之前从未收到此错误,但我找不到任何内容,这是什么意思?

8 个答案:

答案 0 :(得分:10)

注意参数的顺序:

1) jar cvmf manifest.txt some.jar package/*class
2) jar cvfm some.jar manifest.txt package/*class

答案 1 :(得分:6)

检查MANIFEST文件中标头变量的名称。 MANIFEST文件不正确。

本教程将帮助识别MANIFEST文件格式及相关内容http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html

答案 2 :(得分:1)

如果您降落在这里并尝试了所有问题但仍未解决问题,请查看MANIFEST文件中是否有意外标签而不是4个空格用于缩进。

我使用maven pom.xml文件自动生成MANIFEST,属性行太大,跨越多行,如下所示:

<Extension-List> item1 item2 item3 item4
                item5 item6 item7 item8    <--- these lines are idented with tabs
                item9 item10 item11 item12 </Extension-List>

这是以非常难以察觉的方式破坏MANIFEST文件。

答案 3 :(得分:0)

您的清单文件必须遵循required format。如果您自己生成文件,那么您应该能够弄清楚语法错误的位置。但是,如果清单文件是由某个工具或进程生成的,那么您必须检查工具的文档以查看是否遇到了该工具中的错误。

答案 4 :(得分:0)

仔细阅读清单的第一行,例如:

Main-Class: main.HelloWorld

我遇到了这个错误,因为我添加了一个像“Main-Class:”

这样的空格

也许是类似的东西。

答案 5 :(得分:0)

我的问题是我在一行上有很多依赖项,所以我使用一个简单的查找和替换将其拆分,其中每个JAR都在一个单独的行上。事实证明,如果你有类似的东西:

Class-Path: dependencies/org.apache.commons.cli_1.4.jar (note the space at the end)
dependencies/org.apache.log4j_1.2.15.v201012070815.jar (note the space at the end)

您需要确保该行不以空格结尾,并且新行以空格开头,如下所示:

Class-Path: dependencies/org.apache.commons.cli_1.4.jar
 dependencies/org.apache.log4j_1.2.15.v201012070815.jar

答案 6 :(得分:0)

如果您的MANIFEST.MF文件以某些不可打印的字符开头,也会出现此问题。像记事本和wordpad这样的工具不会让你看到它们,所以你会发誓你的文件看起来正确并且你的所有标题都是有效的。

就我而言,我收到了消息:

java.io.IOException: invalid header field name: Built-By

如果您遇到这种情况,那么线索就是在有效的内置标头之前出现的字符。这些是不可打印的字符,以某种方式进入您的MANIFEST.MF文件。另一个线索是打开命令行,导航到您的MANIFEST.MF文件并执行

>cat MANIFEST.MF
□Build-BY: TSRUT
Bundle-Description: Fragment Controller.
Bundle-License:   http://www.apache.org/licenses/LICENSE-2.0.txt

请注意文件开头的第一个标题之前的框字符。如果是这种情况,这就是解决问题的方法:

打开你喜欢的编辑器,手动选择整个文件(不要使用select-all命令,因为它也会选择那些隐藏的字符)。关闭文件。打开编辑器的新实例,粘贴内容,然后将新文件保存回原始的MANIFEST.MF文件。选择是以覆盖。然后验证是否从文件的开头删除了那些隐藏的字符。

答案 7 :(得分:0)

如果清单文件中包含一些其他空行,也会导致此错误。确保删除其他行。