2009-10-15 3 views
16

Ich habe Probleme, mein Java-Programm ausführen (es verwendet einige JARs von Drittanbietern). Ich kann es gut kompilieren, aber wenn ich mein Laufziel in ant anrufe, sagt es, dass es die Klasse nicht finden kann, die ich im Klassenpfad ausgeführt habe. Hier ist, was meine build.xml wie folgt aussieht:Probleme mit dem Festlegen des Classpath in ant

<project basedir="." default="build"> 
<property name="build" value="build" /> 
<property name="src" value="." /> 
<property name="lib" value="lib" /> 

<path id="classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
    <fileset dir="${build}"> 
     <include name="*.class" /> 
    </fileset> 
</path> 

<target name="build"> 
    <javac srcdir="${src}" destdir="${build}"> 
     <classpath refid="classpath" /> 
    </javac> 
</target> 

<target name="run"> 
    <java classname="FirstClass"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

Wer weiß, was könnte ich tun falsch sein?


Hier ist mein Stack-Trace von ant:

ant run Buildfile: build.xml 

run: 
[java] Could not find GuiStarter. Make sure you have it in your classpath 
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:138) 
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:764) 
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218) 
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132) 
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105) 
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[java] at java.lang.reflect.Method.invoke(Method.java:616) 
[java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
[java] at org.apache.tools.ant.Task.perform(Task.java:348) 
[java] at org.apache.tools.ant.Target.execute(Target.java:357) 
[java] at org.apache.tools.ant.Target.performTasks(Target.java:385) 
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) 
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1306) 
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1189) 
[java] at org.apache.tools.ant.Main.runBuild(Main.java:758) 
[java] at org.apache.tools.ant.Main.startAnt(Main.java:217) 
[java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) 
[java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) 
[java] Java Result: -1 

BUILD SUCCESSFUL Total time: 1 second 
+0

Ist das lib Verzeichnis innerhalb des src-Verzeichnis enthalten? Wenn Sie ein separates src-Verzeichnis als basedir verwenden und sich lib auf derselben Ebene wie src befindet, müssen Sie basedir .. erstellen und die Eigenschaft src als Quellverzeichnis angeben. Oder Sie können Ihr Ant-Skript in ein Verzeichnis verschieben. –

+0

Verwenden Sie das Standardpaket in Ihren Quellen? Wenn nicht, müssen Sie wahrscheinlich "**/*. Class" in Ihren Klassenpfad aufnehmen. –

Antwort

3

So wie es ist - nur Gläser innerhalb lib Verzeichnis relativ zu Ihrem Pfad geladen zu werden. Haben Sie all Ihre 3rd-Party-Gläser dort? Möglicherweise gibt es einige Laufzeitbibliotheken, die Sie während der Kompilierung nicht benötigen, die zur Laufzeit fehlen. Wenn Sie Ihren Stacktrace veröffentlichen, erzähle ich Ihnen mehr :)

+0

Mein StackTrace konnte nicht in diesen Kommentar passen, also habe ich eine Antwort auf diese Frage erstellt. – David

+0

Hm - GuiStarter klingt wie Sie haben eine Klasse, die kein Paket (ist es eine von Ihnen?) - In diesem Fall müssen Sie sicherstellen, dass Ihr Top-Level-Verzeichnis ist in der Classpath auch – Bostone

+0

Danke, das war wirklich hilfreich ! Auch 3 Jahre später :) –

5

Ich denke, das Problem ist mit Ihrer classpath Pfad Deklaration. Das build Verzeichnis sollte ein <pathelement>

<path id="classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
    <pathelement location="${build}" /> 
</path> 

auch sein, würde ich nur schließen 3-rd Party Gläser in Ihrem classpath refid. So sieht der ganze Block aus.

Auch, wie DroidIn.net darauf hingewiesen hat, sollten Sie ein Paket für Ihr Programm erstellen.

+0

Ich stimme zu - Ich denke, "pathelement" das ist, was Sie für Klassen verwenden – Bostone

+0

Mit diesen Änderungen bekomme ich eine java.lang.NoClassDefFoundError: com/sun/media/codec/audio/AudioCodec Ausnahme statt a Konnte GuiStarter nicht finden. Stellen Sie sicher, dass Sie es in Ihrem Klassenpfadfehler haben. Ich denke, für dieses Projekt wäre es einfacher, die Gläser in mein anti-lib-Verzeichnis zu legen. – David

+0

Legen Sie die Gläser NICHT in das anti-lib-Verzeichnis. Sieht so aus, als ob die Werkzeuge der dritten Partei von der obigen Bibliothek abhängig sind. Vielleicht wird dies Sie in die richtige Richtung weisen http://ubuntuforums.org/archive/index.php/t-351989.html –

0

Versuchen Sie dies, ich könnte meine Klasse ausführen.

<property name="src.dir" value="src" /> 
<property name="build.dir" value="build" /> 
<property name="classes.dir" value="${build.dir}/classes" /> 
<property name="jar.dir" value="${build.dir}/jar" /> 
<property name="main-class" value="sample.Sample" /> 

<target name="clean"> 
    <delete dir="${classes.dir}" /> 
</target> 

<path id="classpath"> 
    <fileset dir="${jar.dir}"> 
     <include name="*.jar" /> 
    </fileset> 
    <fileset dir="${classes.dir}"> 
     <include name="/*.class" /> 
    </fileset> 
</path> 

<target name="compile"> 
    <mkdir dir="${classes.dir}" /> 
    <javac srcdir="${src.dir}" destdir="${classes.dir}"> 
     <classpath refid="classpath" /> 
    </javac> 
</target> 

<target name="jar" depends="compile"> 
    <mkdir dir="${jar.dir}" /> 
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"> 
     <manifest> 
      <attribute name="Main-Class" value="${main-class}" /> 
     </manifest> 
    </jar> 
</target> 

<target name="run" depends="jar"> 
    <java classname="${main-class}"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

<target name="clean-build" depends="clean,jar" /> 

<target name="main" depends="clean,run" />