Apache муравей манифест класс-путь? - PullRequest
9 голосов
/ 25 марта 2009

У меня есть стандартный макет проекта для Java-проекта:

project /
    src /
        source_file_1.java
        ...
        source_file_N.java
    build /
          classes /
              source_file_X.class
              ...
          jar /
              MyJar.jar
    lib /
          SomeLibrary.jar
          SomeOtherLibrary.jar

Насколько я могу судить, я правильно строю проект с помощью Ant. Мне нужно установить атрибут class-path в файле Manifest, чтобы мои классы могли использовать необходимые библиотеки.

Следующая соответствующая информация из build.xml

<target name="compile" depends="init">
    <javac srcdir="src" destdir="build\classes">
        <classpath id="classpath">
            <fileset dir="lib">
                <include name="**/*.jar" />
            </fileset>
        </classpath>
    </javac>
</target>

<target name="jar" depends="compile">
    <jar destfile="build\jar\MyJar.jar" basedir="build\classes" >
        <manifest>
            <attribute name="Built-By" value="${user.name}" />
        </manifest>
    </jar>
</target>

Любой толчок в правильном направлении приветствуется. Спасибо

Ответы [ 2 ]

38 голосов
/ 25 марта 2009

Предполагая, что библиотеки не меняют расположение с компиляции на исполняемый файл jar, вы можете создать элемент пути к вашему classpath за пределами цели компиляции, например:

<path id="compile.classpath">
    <fileset dir="lib" includes="**/*.jar"/>
</path>

Затем вы можете использовать созданный путь внутри задачи javac вместо текущего пути к классам.

<classpath refid="compile.classpath"/>

Затем вы можете использовать путь для установки пути манифеста.

<target name="jar" depends="compile">
    <manifestclasspath property="jar.classpath" jarfile="build\jar\MyJar.jar">
      <classpath refid="compile.classpath"/>
    </manifestclasspath>    
    <jar destfile="build\jar\MyJar.jar" basedir="build\classes" >
        <manifest>
            <attribute name="Built-By" value="${user.name}" />
            <attribute name="Class-Path" value="${jar.classpath}"/>
        </manifest>
    </jar>
</target> 

manifestclasspath генерирует правильно отформатированный classpath для использования в файле манифеста, который должен быть перенесен после 72 символов. Длинные пути к классам, которые содержат много jar-файлов или длинные пути, могут работать неправильно без использования задачи manifestclasspath.

8 голосов
/ 25 марта 2009

Глядя на мой файл сборки, сгенерированный NetBeans, я нашел этот фрагмент в задаче -do-jar-with-libraries:

<manifest>
    <attribute name="Main-Class" value="${main.class}"/>
    <attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>

Другими словами, похоже, вам просто нужно добавить еще один атрибут в задачу манифеста, которая у вас уже есть.

См. Также документацию Manifest Task .

...