如何防止 jarsign 脚本覆盖已签名 jar 中的现有清单值?

How can I prevent jarsign script from overwriting existing Manifest values in signed jars?

我正在构建一个 Eclipse 插件,我想将其与签名的 jar 一起提供。

使用 Eclipse UI 创建更新站点并从那里手动构建插件和功能后,我想对创建的 jar 进行签名。

这样做会导致 jar 中的清单丢失其 OSGI 元信息属性,因此在重新启动 eclipse 后找不到插件。只有签名信息留在 Jars 的清单中。

我使用此代码段对工件进行签名,但我也可以使用 JDK 工具 jarsign 重现此行为:

<signjar alias="${keystore.alias}" keystore="${keystore}"
          storepass="${keystore.password}"
          lazy="true" tsaurl="http://time.certum.pl/">
    <path>
        <path refid="plugins"/>
        <path refid="features"/>
    </path>
</signjar>

在插件中,我使用插件提供的清单,例如:

Bundle-ManifestVersion: 2
Bundle-Name: Tomcat Manager Plugin

如何实现在签名时保留现有清单?

我发现从 JDK 的角度来看,插件清单不是 "real" 清单。 JDK 视角的清单需要具有属性 其中的清单版本。所以问题中的清单应该是这样的:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Tomcat Manager Plugin

如果 Manifest 看起来像这样并且现在具有明显的强制属性 Manifest-Version,jarsigner 将按预期完成工作并保留现有的 Manifest 内容。