Я хотел бы разбить несколько файлов JAR и затем перестроить в один JAR с помощью ant build script. Возможно ли это?
Как вы используете ant, чтобы развязать несколько файлов JAR и перестроить их в один файл JAR?
Ответ 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>