Упаковка нескольких библиотек, содержащих один и тот же файл - Ant - PullRequest
0 голосов
/ 18 мая 2018

В моем Java-проекте я использую Ant для сборки.Учитывая, что у меня довольно много зависимостей, я хотел бы отправить приложение со всеми библиотеками, упакованными в один 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 содержит несколько файлов с одинаковым именем.

Дело в том, что некоторые из моих библиотек зависимостей (несколько jar одного и того же SDK) поставляются со свойствамифайл.Каждый из них содержит разные данные, но все они имеют одно и то же имя.Можно ли упаковать эти библиотеки в один jar-файл таким образом, чтобы приложение могло обращаться к разным файлам с одинаковыми именами?

Все, что я до сих пор нашел, это дубликат атрибут задачи zip / jar, но это не сработает для меня.Мне нужно сохранить данные из всех файлов.

1 Ответ

0 голосов
/ 21 мая 2018

Через некоторое время мне удалось решить эту проблему самостоятельно.Вот мое решение.Я сомневаюсь, что это лучшее, но оно работает для меня, так что это достаточно хорошо.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...