ich eine JAR-Datei finden oder laden haben foobar.jar
die folgenden zwei Klassen enthalten:Java-Klasse ist in Classpath aber Start schlägt fehl mit Fehler: Konnte keine Hauptklasse
public class Foo {
public static void main(String[] args) {
System.out.println("Foo");
}
}
Die andere Klasse sieht wie folgt aus:
import javax.batch.api.chunk.ItemProcessor;
public class Bar implements ItemProcessor {
public static void main(String[] args) {
System.out.println("Bar");
}
@Override
public Object processItem(Object item) throws Exception {
return item;
}
}
Wenn ich das Programm mit dem folgenden Befehl ausführen, verhält sich das Programm wie erwartet und druckt Foo
:
$ java -cp foobar.jar Foo
Foo
$
Aber wenn ich das Programm zu starten mit der Haupt-Methode in der Klasse Bar
, die JVM druckt einen Startfehler und tritt versuchen:
$ java -cp foobar.jar Bar
Error: Could not find or load main class Bar
$
Dies ist der gleiche Fehler wie wenn ich versuchen würde, das Programm zu starten unter Verwendung einer Klasse, die nicht im Jar ist, z
$ java -cp foobar.jar BarNotThere
Error: Could not find or load main class BarNotThere
$
Warum bekomme ich diesen Fehler? Die Tatsache, dass die Foo.main
Methode gestartet werden kann, und ich bin in der Lage, die Klasse Bar
aus dem Glas zu dekompilieren beweist, dass die Klasse im Klassenpfad verfügbar sein sollte. Ich weiß, dass dies etwas mit der Schnittstelle ItemProcessor
nicht auf dem Klassenpfad zu tun haben könnte. Aber sollte ich nicht einen java.lang.ClassNotFoundException
in diesem Fall bekommen?
Bitte beachten Sie, dass dieses Problem teilweise durch http://stackoverflow.com/questions/18093928/what-does-could-not-find-or-load-main-class-mean bedeckt ist. Ich bin auf dieses Problem gestoßen und habe versucht, es mit dieser Frage zu lösen. Aber zuerst konnte ich es nicht lösen, weil das Problem, dass die Oberklasse nicht auf dem Klassenpfad ist, ein Randfall ist. Deshalb habe ich diesen speziellen Fall als neues Q/A hinzugefügt. – boskoop