我的 JAR 文件必须为 webstart 应用程序签名。最好也将它们打包以最大程度地减少下载时间。我正在尝试将 Ant 任务配置为在应用程序部署期间自动执行。由于打包过程重组了使签名无效的 jar 内部结构,Pack200 documentation推荐 3 个步骤:
- 用 pack200 重新打包 JAR
- 用 jarsigner 给 JAR 签名
- 使用 pack200 压缩 JAR jar 生成 .jar.pack.gz 文件
Ant 有一个默认的 signjar 任务,而 Sun 发布了一个 Pack200 ant task .
问题是 Sun pack200 任务一次只对一个文件进行操作,重新打包操作必须指定一个输出文件。
我相信这应该是一个相当常见的操作,但是我的 ant 文件变得过于复杂并且有太多的临时文件。是时候乞求社区的智慧了:
是否有一种简单的或至少是标准的方法来打包和签署我的所有 JAR 文件?
最佳答案
这是我自己的解决方案。我已经丢弃了预构建 ant targets , 并决定直接运行 pack200 可执行文件。
这种方法有一些优点:
- 有效(jarsigner 无法验证某些 jar)
- 除了jdk没有依赖
- 它不会花很多时间重新包装已经重新包装的 jar
- 它可以对内联文件进行签名和重新打包,允许我将签名版本置于版本控制之下。无需签名两次。
下面是重新打包和内联签名的宏代码:
<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}" />
然后用上面的标签跟随它。这将为每个文件进行最终打包。
关于java - 如何使 Ant 任务对我的所有 JAR 文件进行签名和打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312401/