我对我们目前的构建过程有些担忧。它似乎存在“错误的方式”,并且会导致客户需要下载很多额外的内容。
我们有一个普通的Java项目,通过Webstart发布。它使用了一系列库,我们将其作为.jar文件提供。我们的JNLP文件如下:
<resources>
<!-- Application Resources -->
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" max-heap-size="512m" java-vm-args="-Xincgc" />
<jar href="OurApp.jar" main="true" />
<jar href="nimrodlf-1.2.jar" main="false" />
<jar href="jackson-core-asl-1.9.10.jar" main="false" />
<jar href="jackson-jaxrs-1.9.10.jar" main="false" />
<!-- ... -->
到目前为止一切都很好。现在使用由不同证书签名的JAR存在问题,我猜可能只有当其中一个是自签名证书时才会出现这种情况。无论如何,找到的解决方案是所有JAR都必须使用相同的证书进行签名。
随后,我们将所有JAR(包括我们自己的和库文件)复制到Webstart文件夹中,并使用Ant进行签名:
<target name="sign_jar" depends="check_publish">
<signjar keystore="ourapp.keystore" alias="jenkins" storepass="private" verbose="true">
<path>
<fileset dir="${publish.folder}/" includes="**/*.jar" />
</path>
</signjar>
</target>
这一切都很好,尽管签署每个jar文件需要很长时间。但是,每次我们发布对自己应用程序jar的更改时,它也会导致每个客户端重新下载每个库jar(这很多)。虽然库本质上没有变化,但重新签名使它们看起来是新的。
我们做得对吗?有更好的方法吗?我们能否改变我们的构建过程,使人们可以缓存库jar?