【问题标题】:How do I verify the order of MANIFEST.MF within jar?如何在 jar 中验证 MANIFEST.MF 的顺序?
【发布时间】:2011-06-11 06:55:57
【问题描述】:

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

我正在使用 Java 框架,非常注意这个要求,而不是那么冗长。如何检查 META-INFMANIFEST.MF 在 jar 中的顺序是否正确?

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

更新 2: 这就是我问这个问题的原因: http://www.mail-archive.com/dev@felix.apache.org/msg17097.html

【问题讨论】:

  • 实际上规范并没有说它们必须是第一。但是,jar 命令行工具确实将它们放在首位,并且某些工具期望它们如此,例如,因为工具可以快速扫描整个 JAR 文件目录中的清单。所以这实际上更像是一种约定而不是一种要求。
  • @Neil Bartlett,感谢您的澄清,但这让我的情况变得更糟:(这是问题的根源:mail-archive.com/dev@felix.apache.org/msg17097.html 有什么想法吗?
  • 啊哈,所以这是一个假设清单首先出现的工具实例!要回答您的原始问题,jar tf foo.jar 应按顺序列出 JAR 的内容。
  • @Neil Bartlett,谢谢,工作。您能否将其作为回复与误导性“规范”的披露一起发布?顺便说一句,刚刚检查了我的 Intellij Idea 10 战争神器构建器 - META-INF 追随 WEB-INF,wtf? :)

标签: java jar packaging


【解决方案1】:

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

jar tf foo.jar

请注意,JAR 规范中并没有实际要求 META-INF/MANIFEST.MF 首先出现。然而,由jar 工具(JDK 提供)构建的 JAR确实首先具有清单,因此它已成为惯例。

【讨论】:

  • 我也看不到规范中的要求...但是docs.oracle.com/javase/7/docs/api/java/util/jar/… 确实形式的标准库利用了该约束(不用说所以)。例如。如果您有任何机会重新排序条目(混淆,超级罐,...)getManifest 可能只返回null
【解决方案2】:

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

【讨论】:

  • 谢谢,在某些情况下可能会有所帮助,命令行工具呢?
  • 十六进制编辑?我真的不知道它的命令行工具,但你也可以简单地用记事本打开它并在那里查找字符串,它不会像十六进制编辑器那样漂亮。
  • 嗯,我认为没有命令可以做到这一点,抱歉。编辑:实际上,请尝试 jar 的 -t 选项。来自 jar 帮助:“-t 列出存档的目录”
  • 是的,谢谢,尼尔已经回答了,应该自己猜到了
【解决方案3】:

修复损坏的 JAR:

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

查看:MANIFEST.MF must be the first resource in a jar file – here’s how to fix broken jars

【讨论】:

  • 修复 FileNotFoundException: jar cvfm fixed.jar /tmp/mymanifest/MANIFEST.MF .
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 2017-08-10
  • 2011-05-18
  • 2014-07-24
  • 2011-11-03
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多