2009-07-15 8 views
2

Ich versuche, eine einfache Java-Klasse innerhalb von Eclipse zu kompilieren und auszuführen. Die Kompilieraufgabe funktioniert einwandfrei, und da ich keinen Zielordner angegeben habe, befinden sich die Erstellungsdateien im selben Verzeichnis wie die Quelle. Was in Ordnung ist, im Moment muss ich nur noch lernen, wie ich die Klasse mit der Methode main() ausführen kann.ClassNotFoundException mit ant's Java-Aufgabe und Klassenpfad

Ich habe versucht, den vollständig qualifizierten Namen der Klasse mit (mit Paketnamen, etc.) und den Namen der Klasse allein, aber ich bekomme eine java.lang.ClassNotFoundException

Buildfile: C:\Users....\build.xml 
    run: 
     [java] java.lang.NoClassDefFoundError: code/control/MyClass 
     [java] Caused by: java.lang.ClassNotFoundException: code.control.MyClass 
     [java]  at java.net.URLClassLoader$1.run(Unknown Source) 
     [java]  at java.security.AccessController.doPrivileged(Native Method) 
     [java]  at java.net.URLClassLoader.findClass(Unknown Source) 
     [java]  at java.lang.ClassLoader.loadClass(Unknown Source) 
     [java]  at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     [java]  at java.lang.ClassLoader.loadClass(Unknown Source) 
     [java]  at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
     [java] Could not find the main class: code.control.MyClass. Program will exit. 
     [java] Exception in thread "main" 
     [java] Java Result: 1 
    compile: 
    default: 
    BUILD SUCCESSFUL 
Total time: 234 milliseconds 

Im Folgenden immer werden die Ziele genommen aus meiner Datei build.xml:

<target name="default" depends="compile" description="learn"> 

</target> 

    <target name="compile" depends="run"> 
      <javac srcdir="src/" /> 
    </target> 

    <target name="run"> 
    <java classname="code.control.MyClass" fork="true"/> 
</target> 

Ich kann nicht herausfinden, warum die Klasse nicht gefunden wird. MyClass enthält die main() -Methode und da ich keinen Klassenpfad angegeben habe, sollte er sich das aktuelle Verzeichnis ansehen, welches die src/right?

Die Entwicklung Verzeichnis ist die übliche Eclipse Dateistruktur:

Projektname/src/code/control/MyClass

Wenn es ein Classpath Problem ist, wie ich es beheben könnte? Ich hatte immer Probleme, das Konzept zu verstehen, "setz es auf deinen Klassenpfad" ... Wenn jemand mit dem Klassenpfad im Ameisenkontext ein wenig Erklärung geben könnte, wäre ich sehr dankbar.

Danke für jede Hilfe zu diesem Thema. Die Version von ant ist 1.7.0

+0

beachten Sie, dass ClassNotFoundExceptions und NoClassDefFoundErrors sind nicht synonym. – akf

+0

Haben Sie bemerkt, dass Ihr Ziel "kompilieren" von "run" abhängt? also vor dem Kompilieren wird aufgerufen, laufen ... fix: (...) (.. .)

Antwort

8

Die classpath ist, wo die Java-Laufzeitumgebung nach Ihren .class-Dateien sucht, ähnlich wie Ihr Betriebssystem die PATH-Variable verwendet, um ausführbare Dateien zu finden.

Versuchen Sie dies in Ihrem Build-Skript:

<target name="run"> 
    <java fork="true" classname="code.control.MyClass"> 
     <classpath> 
      <path location="src/"/> 
     </classpath> 
    </java> 

Es gibt eine HelloWorld version for ant ist, die mit Ameise ein Java-Programm den Aufbau geht durch.

+0

Danke Seth, das hat funktioniert. Wenn Sie sich nur über den Klassenpfad Gedanken machen, wird er nicht automatisch festgelegt, wenn Eclipse installiert wurde? Ich weiß, dass ich Java-Version von jedem Verzeichnis an der Befehlszeile ausführen kann. Ich dachte, das wurde automatisch erledigt, aber wenn ich etwas "auf den Klassenpfad setzen muss", wie mache ich das? Hoffe, ich schweife nicht zu sehr von der ursprünglichen Frage ab. Nochmals vielen Dank – denchr

+0

Wenn Sie "Java-Version" verwenden, die die PATH-Variable verwendet, um die ausführbare Java-Datei zu finden. Wenn Sie etwas in den Klassenpfad schreiben müssen, kopieren Sie einfach die .class-Datei in eines der von classpath angegebenen Verzeichnisse. Sie benötigen alle Verzeichnisse, wenn Sie etwas in einem Paket kopieren. – seth

4

Sie sollten Klassenpfad, z.

<java classpath="${bin}" classname="code.control.MyClass"> 

Dabei ist $ {bin} Ihr Ausgabeordner.

+0

Danke, diese Antwort hat auch funktioniert! – denchr

1

Ihre build.xml wie unten ändern und ausprobieren:

<target name="default" depends="run" description="learn"> 

</target> 

    <target name="compile" > 
      <javac srcdir="src/" /> 
    </target> 

    <target name="run" depends="compile"> 
    <java classname="code.control.MyClass" fork="true"/> 
</target> 
Verwandte Themen