我们在构建中对许多jar文件进行了签名。目前,它占用了总构建时间的60-80%,从15分钟变为45分钟以上。因此,我们非常有兴趣通过并行化来加快签名过程。
所有jar都在一个文件夹中,现在我们的脚本看起来像这样:
<property name="jars.dir" location="......" />
<signJar ...paswords etc... />
<fileset dir="${jars.dir}" includes="**/*.jar" />
</signJar>
我不能简单地使用parallel
标记,因为所有的jar都在一个文件夹中,所以我们需要一些其他方法来使其并行。该构建将在许多不同的计算机和服务器上运行,因此解决方案足够灵活以处理不同数量的内核是很重要的。
希望你们中的一些人能帮忙。感谢:)
您可以使用for任务来迭代您的jar文件集,然后用对signJar任务的调用对每个jar进行签名。for任务还有一个并行选项和用于控制并发的属性。
FWIW,这里有一个宏,我用来为webstart签名和打包JAR。这添加了所需的清单属性,并通过重新打包来规范JAR进行签名
当从并行<for>
循环中调用时,此宏运行良好。
您需要根据关键信息调整<signjar>
任务。
<!-- Macro for JAR signing and pack200 -->
<macrodef name="sign-and-pack">
<attribute name="jar"/>
<sequential>
<echo message="Signing and packing @{jar}..."/>
<!-- Kill any existing signatures and delete existing manifest -->
<exec executable="zip" logError="true" failonerror="false">
<arg value="-d"/>
<arg value="--quiet"/>
<arg value="@{jar}"/>
<arg value="META-INF/MANIFEST.MF"/>
<arg value="META-INF/*.SF"/>
<arg value="META-INF/*.DSA"/>
<arg value="META-INF/*.RSA"/>
</exec>
<!-- Rebuild manifest with the required attributes -->
<jar update="true" file="@{jar}">
<manifest>
<attribute name="Application-Name" value="${webstart.app.name}"/>
<attribute name="Permissions" value="all-permissions"/>
<attribute name="Codebase" value="*"/>
<attribute name="Trusted-Only" value="true"/>
</manifest>
</jar>
<!-- Pack and unpack JAR to normalize it -->
<exec executable="pack200" logError="true" failonerror="true">
<arg value="--quiet"/>
<arg value="--repack"/>
<arg value="@{jar}"/>
</exec>
<!-- Sign JAR -->
<signjar keystore="mykeystore.p12" storetype="pkcs12" storepass="secret123" jar="@{jar}"
alias="my key alias"/>
<!-- Compress JAR -->
<exec executable="pack200" logError="true" failonerror="true">
<arg value="--quiet"/>
<arg value="--modification-time=latest"/>
<arg value="@{jar}.pack.gz"/>
<arg value="@{jar}"/>
</exec>
</sequential>
</macrodef>