2009-07-27 28 views
20

Sto cercando di rearchitect la mia tecnica di compilazione per la creazione di file jar Java che dipendono da comuni file jar di terze parti. (GlazedLists, Apache Commons, ecc.)ant, jar file e Class-Path oh my

Io stavo buttando tutti in {Java JRE dir}/lib/ext in modo che fossero automaticamente visti dal JRE, ma questo ha portato a problemi come non ricordare che ho bisogno per distribuire alcuni file jar, quindi mi piacerebbe imparare ad essere più esplicito.

Così li ho trasferiti in c: \ appl \ java \ \ comune, li aggiunto al Eclipse costruire il percorso, aand definito questo nel mio file ant:

<path id="javac_classpath"> 
    <fileset dir="${libDir}"> 
     <include name="*.jar"/> 
    </fileset> 
    <fileset dir="c:/appl/java/common"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 

ho il mio Intestazione manifest del percorso di classe impostata su "." nel mio task jar ma non sembra funzionare anche se inserisco i file jar pertinenti nella stessa directory del file jar dell'applicazione. Posso aggiungerli tutti manualmente uno alla volta all'intestazione del percorso di classe, ma mi chiedo, c'è un modo più semplice per ottenere correttamente l'installazione dell'intestazione del percorso di classe?

risposta

36

Questo è tutto ciò che serve:

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

Come si può probabilmente vedere, presuppone che si sia compilato le vostre classi e le loro uscita Java per ${build}. Si presuppone inoltre che tu abbia copiato i tuoi jarfile su ${dist}/lib.

Detto questo, varrebbe la pena esaminare altri sistemi di build che hanno il supporto integrato per le dipendenze, come Maven e Gradle. Questi altri sistemi di costruzione hanno già pensato a molte strutture di progetto comuni e alle operazioni di compilazione, quindi non è necessario scrivere tutto fino all'ultimo dettaglio.

+1

ahhhh ... questo è quello che stavo cercando. Eccellente! –

+0

Hmmm. Correzione: non funziona per una nuova build, perché la dir $ {dist}/lib potrebbe non esistere ancora. C'è un modo per ritardare l'esecuzione dell'attività ? –

+0

DOH! non importa, avevo messo il e nella sezione root del mio file ant, l'ho solo corretto inserendolo nell'attività jar. grazie ancora!!!!! –

0

Le directory del percorso di classe non includono, per impostazione predefinita, file Jar per motivi di sicurezza. Qualcuno potrebbe inserire un file jar lì e potrebbe essere caricato, ignorando il codice, a tua insaputa. So che c'è stata discussione sull'aggiunta di un altro flag o di un token di fine per consentire l'aggiunta di file Jar al classpath, ma, se la memoria serve, è previsto per la versione 7. Tuttavia, potrei sbagliarmi nell'ultima parte.

0

L'intestazione manifest del percorso di classe per i file jar richiede l'elencazione esplicita dei file jar che si desidera includere. Elencare una directory nel percorso di classe significa che java cercherà i file .class in quella directory, non jarfiles.

4

Quello che vuoi è un mapper. Flattenmapper è probabilmente il più semplice, ma in sostanza è necessario creare un elemento path che specifichi il classpath, quindi utilizzare un pathconvert su di esso per trasformarlo in una stringa che può essere inclusa nel manifest.

Edit: è possibile utilizzare includere le regole per costruire l'elemento di percorso, quindi tutto in una directory che termina con il vaso sarebbe **/*.jar

-1

Visto che siete in formica, probabilmente non si vuole cambiare, ma Maven è abbastanza bravo a identificare tutte le tue dipendenze, e ha diverse possibilità per copiare o combinare i tuoi libar insieme per scopi di distribuzione. Per i miei scopi ho un plugin Maven che crea uno script di esecuzione durante la compilazione, che a sua volta imposta il classpath per me, quindi non ho bisogno di preoccuparmene.

+0

Ivy è un modo abbastanza compatibile con formica per fare gestione delle dipendenze. –

3

Con ant 1.7 e dopo, l'attività manifestclasspath è la strada da seguire. Se si utilizza una versione di formica antecedente alla 1.7, l'attività manifestclasspath non esiste.

Di seguito dà lo stesso risultato: -

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