在我的Java项目中,我使用Ant来构建。考虑到我有很多依赖项,我希望将所有库打包到一个jar中的应用程序(以及另一个jar中的主应用程序)。
我目前使用以下代码执行此操作:
<target name="package-to-2-jars" depends="jar">
<property name="store.jar.name" value="main"/>
<property name="store.dir" value="store"/>
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
<property name="storelibs.jar" value="${store.dir}/sdk.jar"/>
<echo message="Packaging main classes and libraries into two separate JARs at ${store.jar}"/>
<delete dir="${store.dir}"/>
<mkdir dir="${store.dir}"/>
<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
<zipgroupfileset dir="dist" includes="*.jar"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
<jar destfile="${store.dir}/temp_final_lib.jar" filesetmanifest="skip">
<zipgroupfileset dir="lib" includes="*.jar" excludes="*fonts*.jar"/>
</jar>
<zip destfile="${store.jar}">
<zipfileset src="${store.dir}/temp_final.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<zip destfile="${storelibs.jar}">
<zipfileset src="${store.dir}/temp_final_lib.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<delete file="${store.dir}/temp_final.jar"/>
<delete file="${store.dir}/temp_final_lib.jar"/>
</target>
起初一切都很好看。但是,在某些情况下,某些东西没有按预期工作。过了一会儿,我意识到我的sdk.jar包含多个同名文件。
问题是:我的一些依赖库(同一个sdk的多个jar)附带了一个属性文件。它们中的每一个都包含不同的数据,但它们都共享相同的名称。是否可以将这些库打包到一个jar中,以便应用程序能够访问具有相同名称的那些不同文件?
到目前为止我发现的所有内容都是zip / jar任务的重复属性,但这对我来说不起作用。我需要保存所有文件中的数据。
答案 0 :(得分:0)
过了一会儿,我自己设法解决了这个问题。这是我的解决方案。我怀疑这是最好的,但它对我有用,所以它足够好。
<target name="package-to-2-jars" depends="jar">
<property name="store.jar.name" value="main"/>
<property name="store.dir" value="store"/>
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
<property name="storelibs.jar" value="${store.dir}/sdk.jar"/>
<echo message="Packaging main classes and libraries into two separate JARs at ${store.jar}"/>
<delete dir="${store.dir}"/>
<mkdir dir="${store.dir}"/>
<for param="file">
<path>
<fileset dir="lib" includes="*.jar"/>
</path>
<sequential>
<concat destfile="${store.dir}/file.txt" append="yes" fixlastline="true">
<zipentry zipfile="@{file}" name="file.txt"/>
</concat>
</sequential>
</for>
<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
<zipgroupfileset dir="dist" includes="*.jar"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
<jar destfile="${store.dir}/temp_final_lib.jar" filesetmanifest="skip" duplicate="preserve">
<zipfileset file="${store.dir}/file.txt"/>
<zipgroupfileset dir="lib" includes="*.jar" excludes="*fonts*.jar"/>
</jar>
<zip destfile="${store.jar}">
<zipfileset src="${store.dir}/temp_final.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<zip destfile="${storelibs.jar}">
<zipfileset src="${store.dir}/temp_final_lib.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<delete file="${store.dir}/temp_final.jar"/>
<delete file="${store.dir}/temp_final_lib.jar"/>
<delete file="${store.dir}/file.txt"/>
</target>