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

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?

4b9b3361

Ответ 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, поэтому мне не нужно беспокоиться об этом.