如何防止jarsign脚本覆盖已签名jars中现有的Manifest值



我正在构建一个Eclipse插件,我想用签名的jar来交付它。

在使用EclipseUI创建更新站点并手动构建插件和功能之后,我想对创建的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>

从插件中,我使用插件中提供的Manifests,如下所示:

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

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

从JDK的角度来看,我发现插件Manifest不是"真正的"Manifest。JDK视角下的Manifest需要具有Attribute清单版本在里面。所以问题中的清单应该是这样的:

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

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

最新更新