我的网络启动应用程序运行良好,但我意识到我需要将一个 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来解决这个问题,有人可以帮忙吗?