Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IOException:'标题字段无效;使用清单创建.jar文件时_Java_Command Line - Fatal编程技术网

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

Java IOException:'标题字段无效;使用清单创建.jar文件时,java,command-line,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.<i

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

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

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

检查清单文件中头变量的名称。清单文件不正确


本教程将有助于识别清单文件格式和相关内容,请注意参数的顺序:

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

如果您在这里着陆并尝试了所有操作,但仍然无法解决问题,请查看清单文件中是否有意外的制表符,而不是4个缩进空格

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

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

这以一种很难看到的方式破坏了清单文件。

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

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

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

就我而言,我得到的信息是:

java.io.IOException: invalid header field name: Built-By
出现这种情况的线索是出现在有效Build 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文件。选择“是”以覆盖。然后验证这些隐藏字符是否已从文件开头删除。

如果清单文件中有其他空行,也会导致此错误。确保删除附加的行。

这让我大吃一惊!更具体地说,选项的顺序,即cvmf需要匹配参数的顺序。如果m位于f之前,那么在命令中清单文件名应该出现在jar文件名之前。非常感谢。例如,我想maven可能会重复它应该取代make的系统所犯的错误-/