我有一个大小约45MB的jar文件。我使用Pack200来压缩jar文件,然后使用第三方证书进行签名,如下所示:
pack200 --repack a.jar
jarsigner a.jar ... ..
pack200 a.jar.pack.gz a.jar
使用以上内容会导致错误,如下所示(启动应用程序时)
jarsigner: java.lang.SecurityException: SHA1 digest error for xyz.class
我需要使用pack200压缩,因为它会在很大程度上减少jar的下载时间(在压缩后,jar大小减少到大约11MB,大约45MB)。
请帮助解决这个问题。
我是 using java7u60
作为运行时环境和JNLP来实现JAR文件。
很高兴能够提供更多的信息。
答案 0 :(得分:0)
我已经找到了解决方案......
Followiong是我为pack200使用/创建的蚂蚁脚本
<project name="ui-patch-create" default="forloop">
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="C:\Jarsigner\Pack200Task.jar"/>
<description>UI Patch Creation</description>
<property name="product.name" value="some product name"/>
<property name="dest.path" value="C:\Jarsigner\dest"/>
<property name="source.path" value="C:\Jarsigner"/>
<property name="keystore" value="C:\Jarsigner\keystore\locationtokeystore"/>
<target name="forloop">
<foreach target= "CreateJAR" param="JAR-File">
<fileset dir="${dest.path}" casesensitive="yes">
</fileset>
</foreach>
</target>
<target name="CreateJAR">
<echo message="${JAR-File}"/>
<basename property="dir.name" file="${JAR-File}"/>
<echo message="${dir.name}"/>
<antcall target="Build-JAR">
<param name="param1" value="${dir.name}"/>
</antcall>
</target>
<target name="Build-JAR" depends="update-ui-jar,repack-jar, sign-jar, gzip-jar">
<echo>
Building the .jar file.
</echo>
</target>
<!-- Update ${JAR-File} file -->
<target name="update-ui-jar">
<unzip src="${dest.path}\${dir.name}" dest="${dest.path}\test">
<patternset>
<include name="**/MANIFEST.MF"/>
</patternset>
</unzip>
<!-- meta-inf changes for supporting JAVA 7U45 and above...-->
<manifest file="${dest.path}\test\META-INF\MANIFEST.MF" mode="update">
<attribute name="Application-Name" value="Vendor Name"/>
<attribute name="Codebase" value="*"/>
<attribute name="Permissions" value="all-permissions"/>
<attribute name="Trusted-Library" value="true"/>
<attribute name="Caller-Allowable-Codebase" value="*"/>
</manifest>
<jar update="true" manifest="${dest.path}\test\META-INF\MANIFEST.MF" jarfile="${dest.path}\${dir.name}" basedir="${dest.path}\test" />
</target>
<!-- Pack200 repack UI Jar File -->
<target name="repack-jar" depends="update-ui-jar" description="applying pack200 --repack on jar ${dir.name}">
<mkdir dir="${source.path}/repackedjars"/>
<pack200 src="${dest.path}\${dir.name}" destfile="${source.path}/repackedjars/${dir.name}" repack="true"
segmentlimit="-1" stripdebug="false" deflatehint="keep" unknownattribute="pass" keepfileorder="true"/>
</target>
<!-- Sign the UI Jar File -->
<target name="sign-jar" depends="repack-jar">
<echo message="${dir.name}"/>
<signjar jar="${source.path}\repackedjars\${dir.name}" alias="xxxWS" keystore="${keystore}" storepass="storepass" keypass="xxxxxx" signedjar="${source.path}\signed\${dir.name}"/>
</target>
<!-- Pack200 to gzip UI Jar File -->
<target name="gzip-jar" depends="sign-jar" description="applying gzip on jar ${dir.name}">
<mkdir dir="${source.path}/finaljars"/>
<pack200 src="${source.path}\signed\${dir.name}" destfile="${source.path}/finaljars/${dir.name}.pack.gz" gzipoutput="true"/>
</target>
</project>
请注意,在使用theis脚本之前需要下载antcontrin和pack200任务,并且只能在以前未签名的jar上执行ant脚本。
答案 1 :(得分:-2)
您可以尝试添加--segment-limit = -1