2009-03-25 19 views
8

Ho un layout del progetto standard per un progetto Java:Percorso classe classe manifest di Apache?

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

Per quanto posso dire, sto costruendo il progetto correttamente con Ant. Ho bisogno di impostare l'attributo del percorso di classe nel file Manifest in modo che le mie classi possano usare le librerie richieste.

Le seguenti informazioni pertinenti 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> 

Qualunque spinta nella direzione giusta è apprezzato. Grazie

risposta

8

Guardando il mio file di generazione NetBeans-generati, ho trovato questo frammento nel compito -do-jar-with-libraries:

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

Quindi, in altre parole, sembra che hai solo bisogno di aggiungere un altro attributo al compito evidente che hai già.

Vedere anche Manifest Task documentation.

+0

Sono arrivato a questa conclusione prima che tu rispondessi, anche se non ero a conoscenza di jar.classpath. Sono stato espulso da nella documentazione ant http://ant.apache.org/manual/CoreTasks/manifestclasspath.html –

+0

oh sì e grazie –

+0

jar.classpath è definito da NetBeans altrove nel file di build, I credere. –

37

Supponendo che le librerie non cambiano posizione da compilare per l'esecuzione del file jar, è possibile creare un elemento di percorso al classpath di fuori del target di compilazione in questo modo:

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

quindi è possibile utilizzare il percorso creato all'interno del tuo task javac al posto del tuo classpath corrente.

<classpath refid="compile.classpath"/> 

è possibile utilizzare il percorso per impostare un manifestclasspath.

<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> 

Il manifestclasspath genera un percorso di classe correttamente formattato per l'utilizzo in file manifesto che deve essere avvolto dopo 72 caratteri. Classpath lunghi che contengono molti file jar o percorsi lunghi potrebbero non funzionare correttamente senza utilizzare l'attività manifestclasspath.

+0

Anche con flatten: http://stackoverflow.com/questions/858766/generate-manifest-class-path-from-classpath-in-ant – Vadzim

Problemi correlati