Подтвердить что ты не робот

Как вы используете ant, чтобы развязать несколько файлов JAR и перестроить их в один файл JAR?

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

4b9b3361

Ответ 1

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

Чтобы распаковать/развязать все файлы 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" /> сообщает Ant включать все файлы, которые заканчиваются расширением 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>

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

Ответ 2

Да, это!

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

  • Ответ Espen:

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

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

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

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

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

<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

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

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

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

Ответ 4

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

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

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

<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="[email protected]"/>
    </jarjar>
</target>