2009-03-25 4 views
8

У меня есть стандартный макет проекта для проекта Java:Apache ant manifest class-path?

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> 

Любой толчок в правильном направлении ценится. Благодаря

ответ

8

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

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

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

См. Также Manifest Task documentation.

+0

Я сам пришел к такому выводу, прежде чем вы ответили, хотя я не знал о jar.classpath. Я был отброшен с помощью в документации мусора http://ant.apache.org/manual/CoreTasks/manifestclasspath.html – 2009-03-25 19:02:09

+0

oh yea и спасибо – 2009-03-25 19:02:40

+0

jar.classpath определен NetBeans в другом месте в файле сборки, I верить. –

37

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

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

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

<classpath refid="compile.classpath"/> 

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

<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 генерирует правильно отформатированный путь к классам для использования в файле манифеста, который должен быть обернутым после 72 символов. Длинные пути к классам, которые содержат много файлов jar или длинных путей, могут работать некорректно, не используя задачу manifestclasspath.

+0

Также с плоским: http://stackoverflow.com/questions/858766/generate-manifest-class-path-from-classpath-in-ant – Vadzim