2010-12-27 7 views
6

In meinem Java-Quellcode möchte ich verschiedene Klassen aus Java-Archiven (.jar) verwenden, die im "lib" -Verzeichnis meiner Anwendung gespeichert sind. Aber wenn ich "ant run" mache, bekomme ich immer eine "java.lang.NoClassDefFoundError" Nachricht. Ich habe verschiedene Dinge ausprobiert, aber nichts hat funktioniert ... Vielleicht kann mir hier jemand helfen?Wie externe Bibliotheken in Ant build.xml-Datei enthalten?

Das ist mein build.properties Datei:

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 

Das ist mein 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> 

Es wäre schön, wenn jemand helfen könnte.

Prost!

Benny

+0

was macht Ihr 'lib' Verzeichnis aussehen? Sind alle JAR-Dateien in diesem Verzeichnis abgelegt oder gibt es Unterverzeichnisse? –

+0

Alle JAR-Dateien befinden sich in diesem Verzeichnis (ohne Unterverzeichnisse). Die Struktur sieht wie folgt aus: ./lib/log4j-1.2.9.jar,./lib/cobertura.jar, ./lib/easymock-3.0.jar, ... Wie kann ich diese Bibliotheken in meine JAR-Datei aufnehmen? –

Antwort

0

Ich sehe, dass Sie Ihren Classpath für die <java> Aufgabe gesetzt haben versucht.

Haben Sie versucht:

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

EDIT: Doppel die Werte in Ihren Eigenschaften Datei überprüfen. Haben Sie nachgestellte Leerzeichen für den Wert lib.dir oder jar.dir?

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

ant gescheitert mein Programm über Javac selbst zu bauen, wenn ich die benötigten Gläser in einem externen build.properties setzen Datei und verweisen sie durch pathelement oder Classpath refid.

Wenn Ameise Lasten Eigenschaften von einer externen Datei nicht berühren den Wert von Eigenschaften, nachgestellte Leerzeichen wird zum Beispiel nicht beschnitten werden.

Wenn der Wert einen Dateipfad darstellt, wie ein Glas zu kompilieren benötigt, ist die Aufgabe , die den Wert erfordert, javac für Beispiel würde nicht kompiliert, da es kann die Datei nicht auf Hinter Räume aufgrund finden .

+0

Wenn ich das benutze, bekomme ich einen Fehler während "ant compile". Im Moment entpacke ich alle Quellcodedateien meiner externen JAR-Dateien und lege sie in mein eigenes "src" -Verzeichnis. Dann kann ich mein Projekt ohne Probleme ausführen, da die Abhängigkeiten beim Kompilieren und Ausführen meines Projekts enthalten sind. Aber ich denke, das ist nicht der beste Anwendungsfall. Aber bis jetzt habe ich keine andere Lösung gefunden, die die externen JAR-Dateien in meiner eigenen JAR-Datei bereitstellen würde. Ich denke, ich muss mich wieder auf die Deklaration des Klassenpfads im Manifest konzentrieren, wie du mir gesagt hast ... –

+0

@Benny Neugebauer - überprüfe deine Einträge in der Eigenschaftsdatei, um zu sehen, ob hinter deinen Pfadwerten noch Leerzeichen stehen. –

3

Ersetzen classes.dir=${build.dir}/classes mit classes.dir=build/classes und jar.dir=${build.dir}/jar mit jar.dir=build/jar aus Ihrer build.properties Datei arbeiten.

2

Bitte bearbeiten Sie das Zielglas wie folgt. Ich bin sicher, es wird funktionieren.

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

Verwandte Themen