2 Stimmen

ClassNotFoundException mit Ant's java task und Klassenpfad

Ich versuche, eine einfache Java-Klasse in Eclipse zu kompilieren und auszuführen. Die Kompilierungsaufgabe funktioniert gut, und da ich keinen Zielordner angegeben habe, befinden sich die Build-Dateien im selben Verzeichnis wie der Quellcode. Was in Ordnung ist, ist im Moment alles, was ich brauche, um zu lernen, wie ich die Klasse mit der main()-Methode ausführen kann.

Ich habe versucht, den voll qualifizierten Namen der Klasse (mit Paketnamen usw.) und den Klassennamen allein zu verwenden, aber ich erhalte immer 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

Nachfolgend sind die Ziele aus meiner build.xml-Datei aufgeführt:

<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 angebe, sollte es im aktuellen Verzeichnis suchen, das src/ ist, richtig?

Das Entwicklungsverzeichnis entspricht der üblichen Eclipse-Dateistruktur:

Projektname/src/code/control/MyClass

Wenn es ein Klassenpfad-Problem ist, wie könnte ich es beheben? Ich hatte immer Probleme, das Konzept "put it on your classpath" zu verstehen ... Wenn jemand ein wenig Erklärung mit dem Klassenpfad in der Ameise Kontext bieten könnte, wäre ich sehr dankbar.

Vielen Dank für jede Hilfe in dieser Sache. Die Version von ant ist 1.7.0

0 Stimmen

Beachten Sie, dass ClassNotFoundExceptions und NoClassDefFoundErrors nicht synonym sind.

0 Stimmen

Haben Sie bemerkt, dass Ihr Ziel "compile" von "run" abhängt? Also wird "run" vor dem Kompilieren aufgerufen... Korrektur: <target name="compile"> (...) </target> <target name="run" depends="compile"> (...) </target>

8voto

seth Punkte 35911

Le site Klassenpfad ist der Ort, an dem die Java-Laufzeitumgebung nach Ihren .class-Dateien sucht, ähnlich wie Ihr Betriebssystem die Variable PATH 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 für Ameisen das die Erstellung eines Java-Programms mit Ameisen beschreibt.

0 Stimmen

Danke Seth, das hat funktioniert. Ich frage mich nur, ob der Klassenpfad bei der Installation von Eclipse nicht automatisch festgelegt wurde? Ich weiß, dass ich java -version aus einem beliebigen Verzeichnis in der Befehlszeile ausführen kann. Ich dachte, das wird automatisch erledigt, aber wenn ich etwas in den Klassenpfad einfügen muss, wie mache ich das? Ich hoffe, ich schweife nicht zu sehr von der ursprünglichen Frage ab. Nochmals vielen Dank

0 Stimmen

Wenn Sie "java -version" verwenden, wird die PATH-Variable verwendet, um die ausführbare Java-Datei zu finden. Wenn Sie etwas auf dem Klassenpfad ablegen müssen, kopieren Sie die .class-Datei einfach in eines der Verzeichnisse, die in classpath angegeben sind. Sie benötigen alle Verzeichnisse, wenn Sie etwas in ein Paket kopieren.

4voto

janetsmith Punkte 8292

Sollten Sie den Klassenpfad einbeziehen, z. B.

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

wobei ${bin} Ihr Ausgabeverzeichnis ist.

1voto

sravan Punkte 11

Ändern Sie Ihre build.xml wie unten angegeben und probieren Sie es aus:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X