1

我的网络启动应用程序运行良好,但我意识到我需要将一个 lib 目录复制到 tomcat ROOT 目录中才能使我的网络启动应用程序工作,但我只想将我所有的 jar 合并到一个大 jar 中,所以我只是每次更新项目时都需要复制一个文件。我在网上搜索并找到了将所有 jar 合并为一个的解决方案,步骤如下:http: //arunasujith.blogspot.com/2011/08/how-to-build-fat-jar-使用-netbeans.html

我重写了我的 build.xml 看起来像这样:

<project name="Test_Tool" default="default" basedir=".">
    <description>Builds, tests, and runs the project Test_Tool.</description>
    <import file="nbproject/build-impl.xml"/>
    <target name="package-into-one-jar" depends="jar">

        <property name="store.jar.name" value="Test_Tool"/>

        <!-- don't edit below this line -->
        <property name="store.dir" value="dist"/>
        <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

        <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

        <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
            <zipgroupfileset dir="dist" includes="*.jar"/>
            <zipgroupfileset dir="dist/lib" includes="*.jar"/>

            <manifest><attribute name="Main-Class" value="${main.class}"/></manifest>
        </jar>

        <zip destfile="${store.jar}"><zipfileset src="${store.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/></zip>

        <delete file="${store.dir}/temp_final.jar"/>
        <delete dir="${store.dir}/lib"/>
    </target>
</project>

但是当我运行它时,它说有一些文件未签名,并且无法从 html 页面运行,所以我进行了更多搜索,并找到了一种对 jar 文件进行签名的方法,在:http://www. asjava.com/ant/how-do-i-sign-jar-files-in-ant/

所以我想出了一个脚本 [sign_jar.xml],如下所示:

<?xml version="1.0"?>
<project name="ant to create keystore and sign jars" default="signjars" basedir=".">
    <tstamp/>

    <property name="build.output.dir"               value="C:/Dir_Test_Tool/dist"/>
    <property name="build.classes.dir"              value="C:/Dir_Test_Tool/dist"/>
    <property name="verisign.key.store"             value="${build.output.dir}/.keystore"/>
    <property name="verisign.key.storepass"         value="asjava.com"/>
    <property name="verisign.key.alias"             value="asjava"/>
    <property name="verisign.key.pass"              value="asjava.com"/>

     <target name="signjars">
        <mkdir dir="${build.output.dir}"/>
        <genkey alias="${verisign.key.alias}" verbose="true" storepass="${verisign.key.storepass}"
                keypass="${verisign.key.pass}" validity="365" keystore="${verisign.key.store}">
               <dname>
                 <param name="CN" value="AsJava.com Group"/>
                 <param name="OU" value="Jim"/>
                 <param name="O"  value="AsJava.com"/>
                 <param name="C"  value="US"/>
               </dname>
        </genkey>
        <signjar jar="${build.classes.dir}/Test_Tool.jar"
                 signedjar="${build.output.dir}/Test_Tool.jar"
                 alias="${verisign.key.alias}"
                 storepass="${verisign.key.storepass}"
                 keystore="${verisign.key.store}"
                 keypass="${verisign.key.pass}"/>
     </target>

</project>

完成所有更改后,我需要执行以下操作来获取签名的大 jar 文件:

<1> 在 Netbeans 中构建我的项目

<2> 在项目的文件视图中右键单击 build.xml 文件,然后选择 Runtarget >> Other Targets >> package-into-one-jar

<3> 在项目的文件视图中,右键单击 sign_jar.xml 文件,然后选择 Runtarget >> signjars

现在它可以按我的意愿工作:一个签名的大罐子。但是要做到这一点,需要 3 个步骤,必须有一种更简单的方法,为什么不能一步完成呢?所以我将上述文件合并为一个,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test_Tool" default="default" basedir=".">
    <description>Builds, tests, and runs the project Test_Tool.</description>
    <import file="nbproject/build-impl.xml"/>

    <target name="package-into-one-jar" depends="jar">

        <property name="store.jar.name" value="Test_Tool"/>

        <property name="store.dir" value="dist"/>
        <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

        <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

        <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
            <zipgroupfileset dir="dist" includes="*.jar"/>
            <zipgroupfileset dir="dist/lib" includes="*.jar"/>

            <manifest><attribute name="Main-Class" value="${main.class}"/></manifest>
        </jar>

        <zip destfile="${store.jar}"><zipfileset src="${store.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/></zip>

        <delete file="${store.dir}/temp_final.jar"/>
        <delete dir="${store.dir}/lib"/>
    </target>

    <property name="build.output.dir"               value="c:/asjava"/>
    <property name="build.classes.dir"              value="C:/Dir_Test_Tool/dist"/>
    <property name="verisign.key.store"             value="${build.output.dir}/.keystore"/>
    <property name="verisign.key.storepass"         value="asjava.com"/>
    <property name="verisign.key.alias"             value="asjava"/>
    <property name="verisign.key.pass"              value="asjava.com"/>

     <target name="signjars">
        <mkdir dir="${build.output.dir}"/>
        <genkey alias="${verisign.key.alias}" verbose="true" storepass="${verisign.key.storepass}"
                keypass="${verisign.key.pass}" validity="365" keystore="${verisign.key.store}">
               <dname>
                 <param name="CN" value="AsJava.com Group"/>
                 <param name="OU" value="Jim"/>
                 <param name="O"  value="AsJava.com"/>
                 <param name="C"  value="US"/>
               </dname>
        </genkey>
        <signjar jar="${build.classes.dir}/Test_Tool.jar"
                 signedjar="${build.output.dir}/Test_Tool.jar"
                 alias="${verisign.key.alias}"
                 storepass="${verisign.key.storepass}"
                 keystore="${verisign.key.store}"
                 keypass="${verisign.key.pass}"/>
     </target>
</project>

但奇怪的是:现在它将src下的所有编译目录复制到dist中,如果我删除它们,结果大jar将无法运行,我不知道ant是否足够正确地将上述3个步骤合二为一,并且不太了解Netbeans来解决这个问题,有人可以帮忙吗?

4

0 回答 0