2009-03-25 10 views
8

J'ai une disposition standard de projet pour un projet java:Apache ant manifeste 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 

Pour autant que je peux dire, je construis correctement le projet avec Ant. Je dois définir l'attribut class-path dans le fichier Manifest afin que mes classes puissent utiliser les bibliothèques requises.

Les informations suivantes pertinentes de 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> 

Toute poussée dans la bonne direction est apprécié. Merci

Répondre

8

regardant mon dossier de construction NetBeans généré, je trouve cet extrait dans la tâche -do-jar-with-libraries:

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

En d'autres termes, il semble que vous avez juste besoin d'ajouter un autre attribut à la tâche manifeste que tu as déjà.

Voir également le Manifest Task documentation.

+0

Je suis arrivé à cette conclusion moi-même avant de répondre, même si je ne connaissais pas jar.classpath. Je me suis fait décourager par dans la documentation fourmi http://ant.apache.org/manual/CoreTasks/manifestclasspath.html –

+0

oh oui, et merci –

+0

jar.classpath est défini par NetBeans ailleurs dans le fichier de construction, je croyez. –

37

En supposant que les bibliothèques ne changent pas lieu de la compilation pour exécuter le fichier jar, vous pouvez créer un élément de chemin de votre classpath en dehors de la cible de compilation comme ceci:

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

Ensuite, vous pouvez utiliser le chemin créé à l'intérieur de votre tâche javac à la place de votre classpath actuel.

<classpath refid="compile.classpath"/> 

Vous pouvez ensuite utiliser le chemin pour définir un chemin de classe manifeste. La classe manifestclasspath génère un classpath correctement formaté à utiliser dans le fichier manifeste qui doit être enveloppé après 72 caractères. Les classpaths longs qui contiennent de nombreux fichiers jar ou de longs chemins peuvent ne pas fonctionner correctement sans utiliser la tâche manifestclasspath.

+0

Aussi avec aplatir: http://stackoverflow.com/questions/858766/generate-manifest-class-path-from-classpath-in-ant – Vadzim