2010-12-27 14 views
6

Nel mio codice sorgente Java voglio utilizzare classi diverse dagli archivi java (.jar) memorizzati nella directory "lib" della mia applicazione. Ma se faccio "ant run" allora ottengo sempre un messaggio "java.lang.NoClassDefFoundError". Ho provato diverse cose per sistemarlo ma non ha funzionato ... Forse qualcuno qui può aiutarmi?Come includere librerie esterne nel file build.xml Ant?

Questo è il mio build.properties di file:

app.name=MyApplication 
app.version=1.0 
main.class=mypackage.MyMain 
build.dir=build 
classes.dir=${build.dir}/classes 
jar.dir=${build.dir}/jar 
dist.dir=dist 
src.dir=src 
test.dir=test 
lib.dir=lib 

Questo è il mio build.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<project name="My Project" default="run" basedir="."> 
    <description>My description.</description> 

    <property file="build.properties" /> 
    <path id="classpath"> 
    <fileset dir="${lib.dir}" includes="*.jar"/> 
    </path> 

    <!-- Initialization --> 
    <target name="init" description="Prepare needed directories."> 
    <mkdir dir="${build.dir}" /> 
    <mkdir dir="${classes.dir}" /> 
    <mkdir dir="${jar.dir}" /> 
    <mkdir dir="${dist.dir}" /> 
    <mkdir dir="${lib.dir}" /> 
    </target> 

    <!-- Cleanup --> 
    <target name="clean" description="Remove all files created by the build/test process."> 
    <delete dir="${classes.dir}" /> 
    <delete dir="${dist.dir}" /> 
    </target> 

    <!-- Compile application --> 
    <target name="compile"> 
    <mkdir dir="${classes.dir}"/> 
    <javac srcdir="${src.dir}" 
     destdir="${classes.dir}" 
     debug="yes" 
     includeantruntime="false"> 
     <!-- <classpath refid="classpath" /> --> 
    </javac> 
    </target> 

    <!-- Java Archive --> 
    <target name="jar" depends="compile"> 
    <!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>--> 
    <delete dir="${jar.dir}"/> 
    <mkdir dir="${jar.dir}"/> 
    <jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
     <manifest> 
     <attribute name="Class-Path" value="${lib.dir}"/> 
     <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 
    </target> 

    <!-- Run application --> 
    <target name="run" depends="jar"> 

    <java jar="${jar.dir}/${app.name}-${app.version}.jar" 
     fork="true"> 
    </java> 
    <!-- 
    <java fork="true" classname="${main.class}"> 
     <classpath> 
     <path refid="classpath"/> 
     <path location="${jar.dir}/${app.name}-${app.version}.jar"/> 
     </classpath> 
    </java> 
    --> 
    </target> 
</project> 

Sarebbe bello se qualcuno potrebbe aiutare.

Cheers!

Benny

+0

che cosa fa il tuo 'directory lib' assomiglia? Tutti i file jar sono scaricati in quella directory o ci sono sottodirectory? –

+0

Tutti i file jar sono in quella directory (senza alcuna sottodirectory). La struttura assomiglia a: ./lib/log4j-1.2.9.jar,./lib/cobertura.jar, ./lib/easymock-3.0.jar, ... Come posso includere queste librerie nel mio file jar? –

risposta

0

vedo che avete cercato di impostare il percorso di classe per il compito <java>.

Hai provato:

<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true"> 
    <classpath refid="classpath" /> 
</java> 

EDIT: doppio controllo i valori nel file proprietà. Hai spazi finali per il valore di lib.dir o jar.dir?

http://ant.apache.org/faq.html#properties-not-trimmed

formica non è riuscito a costruire il mio programma tramite javac anche quando ho messo i vasi necessari in un file esterno build.properties e farvi riferimento da pathelement o classpath refid.

Quando carica formica oggetti di un file esterno non tocca il valore di proprietà, spazi finali non verrà tagliato per esempio.

Se il valore rappresenta un percorso di file, come un vaso necessarie per compilare il compito che richiede il valore, javac per esempio sarebbe sicuro per compilare poiché non trova il file a causa finali spazi .

+0

Quando lo uso, ricevo un errore mentre "ant compile". Al momento estraggo tutti i file del codice sorgente dei miei file jar esterni e li metto nella mia directory "src". Quindi posso eseguire il mio progetto senza problemi perché le dipendenze sono incluse durante la compilazione e l'esecuzione del mio progetto. Ma penso che questo non sia il miglior caso d'uso. Ma fino ad ora non ho trovato alcuna altra soluzione che fornisca i file jar esterni nel mio file jar. Penso che devo mettere a fuoco di nuovo la dichiarazione del classpath nel manifest come mi hai detto ... –

+0

@Benny Neugebauer - controlla le voci del tuo file di proprietà per vedere se ci sono spazi bianchi finali per i valori del tuo percorso. –

3

Sostituzione classes.dir=${build.dir}/classes con classes.dir=build/classes e jar.dir=${build.dir}/jar con jar.dir=build/jar dal build.properties lima funzionerà.

2

Modifica il barattolo di destinazione come segue. Sono sicuro che funzionerà.

<target name="jar" depends="compile"> 

<delete dir="${jar.dir}"/> 
<mkdir dir="${jar.dir}"/> 
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
    <manifest> 
    <attribute name="Class-Path" value="${lib.dir}"/> 
    <attribute name="Main-Class" value="${main.class}"/> 
    </manifest> 
    <zipgroupfileset dir="${lib.dir}"/> 

</jar> 

Problemi correlati