什么会导致jarsigner覆盖MANIFEST.MF文件?
有时候,使用jarsigner工具进行签名时,会出现覆盖MANIFEST.MF文件的问题。解决这个问题的方法是升级jarsigner插件的版本到3.0.0,并在pom.xml文件中进行相应的配置。
具体的解决方法如下,在pom.xml文件中添加以下代码:
...... org.apache.maven.plugins maven-jarsigner-plugin 3.0.0 sign sign mykeystore.jks myalias password password
当然,还可能会出现其他问题,比如在我个人的案例中出现了ClassNotFoundException的错误。经过排查发现,在我的JAR文件的META-INF文件夹中包含了一些来自bouncycastle签名的JAR文件的.SF和.DSA文件,这些文件通过shade插件被传递到了我的JAR文件中,它们与后续使用jarsigner插件进行签名时产生了冲突,导致在使用"java -jar myjar.jar"命令运行结果时出现了"invalid signature file digest for manifest main attributes"的错误。
原文链接:[this error](https://stackoverflow.com/questions/34855649)
以上就是解决jarsigner覆盖MANIFEST.MF文件的问题的具体方法。
问题出现的原因是,当使用jarsigner签名debug jar时,MANIFEST.MF文件会被覆盖,只包含签名条目。然而,当使用jarsigner签名release jar时,签名条目会被追加到现有的MANIFEST.MF文件的末尾。根据进一步的调查,发现原始的MANIFEST.MF文件没有包含"Manifest-Version"头条目。添加了这个条目后,再次使用原始的"debug.keystore"签名debug jar时,两个jar都将签名条目追加到现有的MANIFEST.MF文件的末尾,而不是覆盖MANIFEST.MF文件。
解决方法是,为MANIFEST.MF文件添加"Manifest-Version"头条目。这样,在使用jarsigner签名debug jar时,MANIFEST.MF文件不会被覆盖,而是将签名条目追加到现有的MANIFEST.MF文件的末尾。
在这个问题中,还观察到使用不同的keystore会导致不同的结果。使用默认的"debug.keystore"时,MANIFEST.MF文件被覆盖;而使用私有keystore时,MANIFEST.MF文件被追加。这表明与keystore本身有关的因素决定了MANIFEST.MF文件是否被覆盖。
总之,解决这个问题的方法是为MANIFEST.MF文件添加"Manifest-Version"头条目。这样,不论是使用哪个keystore,签名条目都会被追加到现有的MANIFEST.MF文件的末尾,而不是覆盖MANIFEST.MF文件。