Ant, jar файлы и Class-Path oh my
Я пытаюсь перестроить метод сборки для создания файлов jar Java, которые зависят от обычных файлов сторонних баннеров. (GlazedLists, Apache Commons и т.д.)
Я все их вбрасывал в {Java JRE dir}/lib/ext, поэтому они автоматически просматривались JRE, но это приводило к таким проблемам, как не помнить, что мне нужно распространять определенные файлы jar, поэтому я бы как научиться быть более явным.
Поэтому я переместил их всех в c:\appl\java\common \, добавив их в путь сборки Eclipse, и определил это в моем файле ant:
<path id="javac_classpath">
<fileset dir="${libDir}">
<include name="*.jar"/>
</fileset>
<fileset dir="c:/appl/java/common">
<include name="*.jar"/>
</fileset>
</path>
У меня есть заголовок манифеста Class-Path, установленный в "." в моей задаче jar
, но это не работает, даже если я помещаю соответствующие файлы jar в тот же каталог, что и файл jar приложения. Я могу добавить их все вручную по одному в заголовок Class-Path, но мне интересно, есть ли более простой способ правильно настроить заголовок класса Path?
Ответы
Ответ 1
Это все, что вам нужно:
<path id="build-classpath">
<fileset dir="${dist}/lib">
<include name="*.jar"/>
</fileset>
</path>
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar">
<classpath refid="build-classpath"/>
</manifestclasspath>
<jar jarfile="${dist}/lib/myprog.jar"
basedir="${build}"
includes="com/my/prog/**" >
<manifest>
<attribute name="Main-Class" value="com.my.prog.MyProg"/>
<attribute name="Class-Path" value="${lib.list}"/>
</manifest>
</jar>
Как вы, вероятно, видите, предполагается, что вы скомпилировали свои классы Java и вывели их на ${build}
. Он также предполагает, что вы скопировали свои файлы jarfiles на ${dist}/lib
.
Тем не менее, стоит обратить внимание на другие системы сборки, которые имеют встроенную поддержку зависимостей, таких как Maven и Gradle. Эти другие системы сборки уже рассмотрели многие общие структуры проектов и операции сборки, поэтому вам не нужно script все до последней детали.
Ответ 2
Вы хотите mapper. Flattenmapper, вероятно, самый простой, но по существу вам нужно создать элемент пути, который задает ваш путь к классу, а затем использовать для него pathconvert, чтобы превратить его в строку, которая может быть включена в ваш манифест.
Изменить: вы можете использовать правила включения для создания элемента пути, поэтому все в каталоге, заканчивающемся jar, будет **/*.jar
Ответ 3
С ant 1.7 и после этого задача manifestclasspath - это путь вперед.
Если вы используете версию ant до 1.7, задача manifestclasspath не существует.
Ниже приводится тот же результат: -
<path id="build.classpath">
<fileset dir="${dist}/lib">
<include name="*.jar" />
<exclude name="myprog.jar" />
</fileset>
</path>
<pathconvert property="lib.list" pathsep=" ">
<path refid="build.classpath" />
<mapper>
<chainedmapper>
<flattenmapper />
</chainedmapper>
</mapper>
</pathconvert>
<target name="generate.jar">
<jar destfile="${dist}/lib/myprog.jar">
<manifest>
<attribute name="Main-Class"
value="com.mypackage.MyClass" />
<attribute name="Class-Path" value="${manifest.classpath}" />
</manifest>
</jar>
</target>
Ответ 4
В каталогах классов классов по умолчанию нет файлов Jar по соображениям безопасности. Кто-то может разместить там файл jar, и он может быть загружен, переопределяя ваш код, без вашего ведома. Я знаю, что была дискуссия о добавлении другого флага или конечного токена, чтобы файлы Jar могли быть добавлены в путь к классам, но, если моя память обслуживается, это версия для версии 7. Однако я мог ошибаться в последней части.
Ответ 5
Заголовок манифеста Class-Path для файлов jar требует, чтобы вы явно указывали файлы jar, которые вы хотите включить.
Листинг каталога в пути к классам означает, что java будет искать файлы .class в этом каталоге, а не jarfiles.
Ответ 6
Поскольку вы находитесь в Ant, вы, вероятно, не хотите переключаться, но Maven довольно хорошо идентифицирует все ваши зависимости и имеет несколько возможностей для копирования или объединения ваших баннеров lib в целях распространения. Для моих целей у меня есть плагин Maven, который создает во время сборки run script, который, в свою очередь, устанавливает для меня путь classpath, поэтому мне не нужно беспокоиться об этом.