这是我自己的解决方案我的Webstart的应用。我放弃了预制anttargets,并决定直接运行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>
编辑来为人们提供一些更多的信息是不知道蚂蚁如此好:
上面的任务在你的标签之前。里面的标签先放调用宏这样使其第一重新包装和标志的每个文件:
<repack-and-sign rootdir="${dir.tomcat.jar}" />
然后按照与从上面的标签。这将为每个文件做最后的包装。
pack200将失败。在这种情况下,你会得到一个像“线程中的异常”主要“java.lang.SecurityException:SHA1 digest error for ...”的错误消息。潜在的错误是签名打包的jar返回成功,但是如果运行jarsigner - 验证,它会报告失败。 – cmcginty 2013-04-18 03:26:05
向重新包装目标添加--segment-limit = -1参数以避免bug http://bugs.sun.com/view_bug.do?bug_id=5078608(请参阅第1种解决方法)也是一个好主意。 – foch 2014-01-03 17:06:43