这是我自己的解决方案。我已经放弃了 prebuild ant 目标,并决定直接运行 pack200 可执行文件。
这种方法有一些优点:
- 它有效(jarsigner 未能验证某些罐子)
- 除了 jdk 没有依赖
- 它不会花很多时间重新包装已经重新包装的罐子
- 它可以内联签名和重新打包文件,允许我将签名版本置于版本控制之下。不需要签两次。
这是重新打包和内联签名的宏的代码:
<macrodef name="repack-and-sign">
<attribute name ="rootdir"/>
<sequential>
<echo message="Repacking libs in @{rootdir}"/>
<apply executable="pack200" parallel="false">
<arg value="--repack"/>
<arg value="--segment-limit=-1"/>
<fileset dir="@{rootdir}" includes="**/*.jar" />
</apply>
<echo message="Signing libs in @{rootdir}"/>
<signjar
alias="${keystore.alias}" keystore="${keystore.file}" storepass="${keystore.password}"
lazy="true">
<path>
<fileset dir="@{rootdir}" includes="**/*.jar" />
</path>
</signjar>
</sequential>
</macrodef>
以下是如何打包:
<apply executable="pack200" parallel="false" dest="${dir.tomcat.jar}">
<arg value="--modification-time=latest"/>
<arg value="--deflate-hint=true"/>
<arg value="--segment-limit=-1"/>
<targetfile/>
<srcfile/>
<fileset dir="${dir.tomcat.jar}" includes="**/*.jar" />
<mapper type="glob" from="*" to="*.pack.gz" />
</apply>
编辑为不太了解 ant 的人提供更多信息:
上面的任务先于你的标签。在您的标签中,首先像这样调用宏,以便它首先重新打包并签署每个文件:
<repack-and-sign rootdir="${dir.tomcat.jar}" />
然后按照上面的标签进行操作。这将对每个文件进行最终打包。