在签名的jar文件上使用pack200

时间:2015-01-09 06:01:35

标签: java jar jarsigner

我有一个大小约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文件。
很高兴能够提供更多的信息。

2 个答案:

答案 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