是什么导致 jarsigner 覆盖清单.中频



问题是为什么jarsigner有时会覆盖MANIFEST。MF 文件,而不仅仅是将签名条目追加到现有清单。正在签名的 jar 中的 MF 文件。

注意:我将其发布为开放式问题,并将对导致此问题的一种情况提供答案或观察。如果有其他情况或情况可以发生这种情况,希望其他人会扩展发布的问题。

这是我看到的一种情况。 我有一个 gradle 构建,它构建了一个使用 jarsigner 创建的调试和发布签名的 jar。 调试 jar 由 android studio 提供的默认"debug.keystore"签名,发布 jar 由我的私钥库签名。出于实际目的,这两个罐子几乎相同。 两者都包含相同的元INF/清单。MF 条目。 调试 jar 的 jarsigner 覆盖了清单。MF 条目。 它仅包含签名条目。 另一方面,发布 jar 的 jarsigner 将签名条目附加到现有清单的末尾。MF 文件如预期的那样。 只是为了好玩,我制作了"debug.keystore"的副本并重命名了它,并尝试将其用于密钥库。 清单文件仍被覆盖。 然后,我创建了一个私钥库,并使用与debug.keystore中包含的相同密钥别名cn,o,ou创建了它。 这次清单文件被追加到而不是被覆盖。这似乎意味着与密钥库本身相关的某些东西决定了 MANIFEST 是否。MF文件是否被覆盖。 奇怪,但这就是我观察到的。

经过进一步调查,我发现我的原始清单。MF 文件不包含"清单版本"标头条目。 所以我添加了该条目并再次尝试使用原始的"debug.keystore"对调试jar进行签名。 这一次,两个 jar 都将签名条目附加到现有清单的末尾。MF 文件,而不是覆盖清单的调试 jar。MF 文件。从这一观察结果来看,我们都可以说,这是有道理的。但谁能想到。我当然找不到任何地方记录的行为。

呃,我自己对此事的 2 美分是简单地将 jarsigner 插件升级到版本3.0.0解决了问题(原始清单条目保持不变(

在POM中.xml:

...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jarsigner-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>sign</id>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
<configuration>
<keystore>mykeystore.jks</keystore>
<alias>myalias</alias>
<storepass>password</storepass>
<keypass>password</keypass>
</configuration>
</plugin>
...

当然,其他问题可能仍然存在 - 例如,在我的情况下,仍然抛出ClassNotFoundException-因为事实证明有一些充气城堡。顺丰和.DSA 文件包含在我的 JAR 的 META-INF 文件夹中,由阴影插件从弹力城堡签名的 JAR 携带 - 它们干扰了我后来使用 jarsigner 插件进行的签名,导致此错误在运行生成的 jar 时java -jar myjar.jar

最新更新