当我在命令提示符下键入jar cvfm file_name.jar清单时.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)
我以前从未遇到过此错误,也找不到任何内容,这是什么意思?
注意参数的顺序:
1) jar cvmf manifest.txt some.jar package/*class
2) jar cvfm some.jar manifest.txt package/*class
检查清单文件中标头变量的名称。清单文件不正确。
本教程将帮助识别 MANIFEST 文件格式和相关内容,http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
如果您降落在这里并尝试了所有方法,但仍然没有解决问题,请查看 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 文件。
您的清单文件必须遵循所需的格式。如果您自己生成文件,那么您应该能够找出语法错误的地方。但是,如果清单文件是由某个工具或进程生成的,则必须检查该工具的文档,以查看工具中是否遇到了错误。
仔细阅读清单的第一行,例如:
Main-Class: main.HelloWorld
我有这个错误,因为我添加了一个像这样的空格"主类:"
也许是类似的东西。
我的问题是我在一行上有很多依赖项,所以我使用简单的查找和替换将其拆分,其中每个 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
如果您的清单,也会出现此问题。MF文件以一些不可打印的字符开头。记事本和写字板等工具不会让你看到它们,所以你会发誓你的文件看起来是正确的,并且你的所有标题都是有效的。
就我而言,我收到了以下消息:
java.io.IOException: invalid header field name: Built-By
如果您遇到这种情况,线索是那些出现在有效内置标头之前的字符。这些是不可打印的字符,以某种方式进入了您的清单。MF 文件。 另一个线索是打开命令行,导航到您的清单。MF 文件并执行
>cat MANIFEST.MF
□Build-BY: TSRUT
Bundle-Description: Fragment Controller.
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
请注意文件开头第一个标题之前的框字符。 如果是这种情况,这是您问题的解决方案:
打开您喜欢的编辑器,手动选择整个文件(不要使用 select-all 命令,因为这也会选择那些隐藏字符)。关闭文件。打开编辑器的新实例,粘贴内容,然后将新文件保存回原始清单。MF 文件。 选择"是"进行覆盖。然后验证是否已从文件开头删除这些隐藏字符。
如果您的清单文件有一些额外的空行也会导致此错误。确保删除其他行。