9

我的 JAR 文件必须为 webstart 应用程序签名。最好将它们打包以最大程度地减少下载时间。我正在尝试将 Ant 任务配置为在应用程序部署期间自动执行此操作。由于打包过程重新组织了使签名无效的 jar 内部结构,因此Pack200 文档建议采用 3 步过程:

  1. 用 pack200 重新打包 JAR
  2. 使用 jarsigner 签署 JAR
  3. 使用 pack200 压缩 JAR jar 生成 .jar.pack.gz 文件

Ant 有一个默认的 signjar 任务,Sun 发布了一个Pack200 ant 任务

问题是 Sun pack200 任务一次只对一个文件进行操作,并且重新打包操作必须指定一个输出文件。

我相信这应该是一个相当普遍的操作,但是我的 ant 文件变得过于复杂并且临时文件太多。是时候乞求社区的智慧了:

是否有一种简单的或至少是标准的方法来打包和签署我的所有 JAR 文件?

4

3 回答 3

10

这是我自己的解决方案。我已经放弃了 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}" />

然后按照上面的标签进行操作。这将对每个文件进行最终打包。

于 2010-08-17T22:35:08.287 回答
1

The Pack200 tasks on Java.net have been updated to work with filesets. Give it another try:

http://java.net/projects/deployment

于 2011-08-04T12:49:41.363 回答
1

您可以在 signjar 任务中使用文件集

<signjar alias="ws" keypass="wskey"
                 storepass="wspass" keystore="${artifact.root.dir}/deployJAWS.key">
            <fileset dir="${lib.temp.root.dir}">
                <include name="**/*.jar" />
            </fileset>
</signjar>

我使用上面的代码片段来签署我的 WebStart 应用程序,该应用程序由大约 70 个 jars 组成

于 2010-08-16T07:51:34.113 回答