2010-07-22 25 views
9

我的JAR文件必须为webstart应用程序签名。将它们打包以最大限度地缩短下载时间会很好。我试图配置一个Ant任务,在应用程序的部署过程中自动完成它。由于包过程重新组织罐内部结构无效的签名时,Pack200 documentation建议一个3个步骤的过程:如何让Ant任务对我的所有JAR文件进行签名和打包200?

  1. 重新包装同pack200的JAR
  2. 标志的jarsigner对JAR
  3. 压缩JAR罐子pack200产生.jar.pack.gz文件

Ant具有默认签名任务,Sun发布了Pack200 ant task

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

我相信它应该是一个相当常见的操作,但我的ant文件变得过于复杂,并且有太多的临时文件。时间乞求社区的智慧:

是否有一个容易或至少标准的方式来打包和签署我所有的JAR文件?

回答

10

这是我自己的解决方案我的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}" /> 

然后按照与从上面的标签。这将为每个文件做最后的包装。

+0

pack200将失败。在这种情况下,你会得到一个像“线程中的异常”主要“java.lang.SecurityException:SHA1 digest error for ...”的错误消息。潜在的错误是签名打包的jar返回成功,但是如果运行jarsigner - 验证,它会报告失败。 – cmcginty 2013-04-18 03:26:05

+0

向重新包装目标添加--segment-limit = -1参数以避免bug http://bugs.sun.com/view_bug.do?bug_id=5078608(请参阅第1种解决方法)也是一个好主意。 – foch 2014-01-03 17:06:43

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> 

内的文件集我用上面的代码中签一个由大约70罐

1

Java.net上的Pack200任务已更新为可与文件集配合使用。给它的另一个尝试:瓶子是否在重新包装操作之前签署

http://java.net/projects/deployment

相关问题