Как вы используете ant, чтобы разархивировать несколько файлов JAR и перестроить их в один файл JAR? - PullRequest
19 голосов
/ 13 мая 2010

Я хотел бы разархивировать несколько файлов JAR, а затем перестроить в один JAR, используя скрипт сборки ant. Возможно ли это?

Ответы [ 4 ]

14 голосов
/ 13 мая 2010

Да, это возможно с муравьем. Файл jar - это, по сути, zip со специальным файлом манифеста. Таким образом, чтобы распаковать, нам нужно распаковать банки. Ant включает в себя задачу распаковать .

Чтобы разархивировать / разархивировать все файлы jar в вашем проекте:

<target name="unjar_dependencies" depends="clean">
    <unzip dest="${build.dir}">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar" />
        </fileset>    
    </unzip>
</target>

Очевидно, вам нужно сначала объявить $ {build.dir} и $ {lib.dir}. Строка <include name="**/*.jar" /> говорит муравью включить все файлы, которые заканчиваются расширением jar, вы можете настроить его, чтобы удовлетворить ваши потребности.

Чтобы упаковать все в банку, вы используете задачу jar :

<target name="make_jar" depends="compile, unjar_dependencies">
    <jar basedir="${build.dir}"
         destfile="${dist.dir}/${project_name}.jar">
        <manifest>
            <attribute name="Main-Class" value="${mainclass}" />
        </manifest>
        <fileset dir="${build.dir}">
            <include name="**/*.class" />
        </fileset>
        <fileset dir="${src.dir}">
            <include name="applicationContext.xml" />
            <include name="log4j.properties" />
        </fileset>
    </jar>
</target>

В этом примере мы включаем разные наборы файлов. В один набор файлов мы включаем все скомпилированные классы. В другой набор файлов мы включаем два файла конфигурации, от которых зависит данный проект.

7 голосов
/ 13 мая 2010

Да, это так!

У вас есть две возможности:

  • Ответ Эспена:

Одно из возможных решений, которое создает JAR-файл из всех JAR-файлов в данный каталог:

<target name="dependencies.jar">
    <jar destfile="WebContent/dependencies.jar">
        <zipgroupfileset dir="lib/default/" includes="*.jar" 
              excludes="*.properties" />
    </jar>
</target>

Это полезно, если вам не нужно исключать содержимое, содержащееся в некоторых банках (например, некоторые файлы конфигурации свойств, которые могут переопределять ваш, и т. Д.). Здесь свойства exclude фильтруют файлы из свойства dir.

  • Использовать zipfileset

Другим решением является использование тега zipfileset, где свойство exclude на этот раз отфильтровывает содержимое из фляги, которую нужно объединить.

<jar destfile="your_final_jar.jar" filesetmanifest="mergewithoutmain">
    <manifest>
        <attribute name="Main-Class" value="main.class"/>
        <attribute name="Class-Path" value="."/>
    </manifest>
    <zipfileset 
       excludes="META-INF/*.SF"
       src="/path/to/first/jar/to/include.jar"/>
</jar>
  • Конечно, вы можете объединить два тега (zipfileset и zipgroupfileset) внутри одного тега jar, чтобы получить лучшее из двух.
3 голосов
/ 13 мая 2010

Да, это возможно.

Одно возможное решение, которое создает один файл JAR из всех файлов JAR в данном каталоге:

<target name="dependencies.jar">
    <jar destfile="WebContent/dependencies.jar">
        <zipgroupfileset dir="lib/default/" includes="*.jar" 
              excludes="*.properties" />
    </jar>
</target>
0 голосов
/ 18 ноября 2013

Существует также проект, посвященный упаковке банок, под названием JarJar . Вы можете использовать его для упаковки нескольких банок в один. В зависимости от ваших требований вы можете даже переименовать классы, чтобы предотвратить конфликт версий.

со страницы начала работы :

В этом примере мы включаем классы из jaxen.jar и добавляем правило, которое заменяет любое имя класса, начинающееся с «org.jaxen», вместо «org.example.jaxen» (в нашем воображаемом мире домен example.org):

<target name="jar" depends="compile">
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
        classpath="lib/jarjar.jar"/>
    <jarjar jarfile="dist/example.jar">
        <fileset dir="build/main"/>
        <zipfileset src="lib/jaxen.jar"/>
        <rule pattern="org.jaxen.**" result="org.example.@1"/>
    </jarjar>
</target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...