【问题标题】:IOException: 'Invalid header field; when creating .jar file with manifestIOException: '无效的标头字段;使用清单创建 .jar 文件时
【发布时间】:2013-09-20 01:49:26
【问题描述】:

当我在命令提示符中键入 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)

我以前从来没有遇到过这个错误,我在上面找不到任何东西,这是什么意思?

【问题讨论】:

    标签: java command-line


    【解决方案1】:

    注意参数的顺序:

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

    【讨论】:

    • 这让我明白了!更具体地说,选项的顺序,即 cvmf 需要匹配参数的顺序。如果“m”出现在“f”之前,则清单文件名应出现在命令中的 jar 文件名之前。
    • 比所有其他文档加起来更好
    【解决方案2】:

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

    Main-Class: main.HelloWorld
    

    我遇到了这个错误,因为我添加了一个类似“Main-Class :”的空格

    也许是类似的东西。

    【讨论】:

      【解决方案3】:

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

      本教程将帮助识别 MANIFEST 文件格式和相关的东西,http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html

      【讨论】:

        【解决方案4】:

        如果您来到这里并尝试了所有方法,但仍然没有解决问题,请查看 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 文件。

        【讨论】:

        • 非常感谢。我猜它会让 maven 重现与它应该替换的系统相同的错误(例如,make)。 :-/
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我的问题是我在一行上有很多依赖项,因此我使用简单的查找和替换将其拆分,其中每个 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
          

          【讨论】:

            【解决方案7】:

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

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

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

            如果您遇到这种情况,线索是出现在有效的 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
            

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

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

            【讨论】:

              【解决方案8】:

              如果你的清单文件有一些额外的空行也会导致这个错误。确保删除额外的行。

              【讨论】:

                猜你喜欢
                • 2014-05-23
                • 2012-10-30
                • 2010-09-29
                • 2014-02-08
                • 2010-11-27
                • 2011-03-04
                • 2020-05-07
                • 2012-12-26
                • 1970-01-01
                相关资源
                最近更新 更多