打包包含相同文件的多个库 - Ant

时间:2018-05-18 10:41:07

标签: java ant

在我的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任务的重复属性,但这对我来说不起作用。我需要保存所有文件中的数据。

1 个答案:

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