Java 如何在jar中验证MANIFEST.MF的顺序?

Java 如何在jar中验证MANIFEST.MF的顺序?,java,jar,packaging,Java,Jar,Packaging,我遇到了一个有趣的问题,这对我来说是全新的。正如我突然发现的,Jar规范说,被包括在内的META-INF和MANIFEST.MF必须是*.Jar包的第一个和第二个条目,而不仅仅是归档文件中的目录和文件 我在使用Java框架时非常注意这一需求,而不是过于冗长。如何检查META-INF和MANIFEST.MF在jar中的顺序是否正确 更新: 很多jar是第三方的,而且有很多jar。我无法在记事本、excel、hexeditor、photoshop或任何查找字节序列的工具中打开这些JAR。我需要命令行

我遇到了一个有趣的问题,这对我来说是全新的。正如我突然发现的,Jar规范说,被包括在内的
META-INF
MANIFEST.MF
必须是
*.Jar
包的第一个和第二个条目,而不仅仅是归档文件中的目录和文件

我在使用Java框架时非常注意这一需求,而不是过于冗长。如何检查
META-INF
MANIFEST.MF
在jar中的顺序是否正确

更新: 很多jar是第三方的,而且有很多jar。我无法在记事本、excel、hexeditor、photoshop或任何查找字节序列的工具中打开这些JAR。我需要命令行工具。谢谢

更新2: 我问这个问题的原因如下:

带有JDK的jar工具会首先自动添加它们,因此不需要做任何事情。如果确实要检查,请使用十六进制编辑器,在任何其他文件名之前查找字符串“META-INF”和“MANIFEST.MF”。

以下命令将按顺序列出JAR的内容:

jar tf foo.jar

注意,JAR规范中没有实际要求首先出现
META-INF/MANIFEST.MF
。但是,由
jar
工具(随JDK一起提供)构建的jar不首先具有清单,因此它已成为一种惯例。

修复损坏的jar:

$ mkdir foo
$ cd foo
$ jar xvf ../broken.jar
$ mv META-INF/MANIFEST.MF /tmp/mymanifest
$ jar cvfm fixed.jar /tmp/mymanifest .

请参阅:

谢谢,在某些情况下可能会有所帮助,那么命令行工具呢?用于十六进制编辑?我真的不知道它的命令行工具,但你也可以简单地用记事本打开它并在那里查找字符串,它不会像十六进制编辑器那样漂亮。嗯,我认为没有命令可以做到这一点,对不起。编辑:实际上,可以尝试使用-t选项来编辑
jar
。从jar帮助中:“-t列出存档的目录”是的,谢谢,Neil已经回答了,我自己应该猜到了。事实上,规范并没有说它们必须是第一个。然而,
jar
命令行工具确实将它们放在第一位,一些工具期望它们是第一位的,例如,因为工具可以快速扫描整个jar文件目录中的清单。因此,这实际上是一种惯例,而不是一种要求。@Neil Bartlett,谢谢你的澄清,但这对我来说更糟:(这是问题的根源:有什么想法吗?啊哈,这是一个假设清单首先出现的工具实例!为了回答您最初的问题,
jar tf foo.jar
应该按顺序列出jar的内容。@Neil Bartlett,谢谢,正在工作。您能将其作为回复与误导性的“规范”一起发布吗?)?顺便说一句,刚刚检查了我的Intellij Idea 10 war工件生成器-META-INF在WEB-INF之后,wtf?:)我也看不到规范中的要求…但是以的形式的标准库确实使用了该约束(没有这样说)。例如,如果您碰巧对条目进行了重新排序(模糊处理,uber jar,…)
getManifest
可能只返回
null
。要修复FileNotFoundException:jar cvfm fixed.jar/tmp/mymanifest/MANIFEST.MF。