Die Hauptklasse kann in der mit Ant kompilierten Datei nicht gefunden werden

Ich kompiliere und führe mein Programm in Eclipse und alles funktioniert gut, aber wenn ich es mit Ant verpacken und es ausführen, erhalte ich diesen Fehler:

Exception in thread "main" java.lang.NoClassDefFoundError: org/supercsv/io/ICsvB eanReader Caused by: java.lang.ClassNotFoundException: org.supercsv.io.ICsvBeanReader at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: jab.jm.main.Test. Program will exit. 

Beachten Sie, dass dies ein Laufzeiterrors und kein Compilererrors mit Ant ist.

Ich habe dieses Projekt in der Vergangenheit mit 0 Problemen gebaut und jetzt geht es plötzlich auf mich, wenn ich ein zweites Paket zu meinem lib-Ordner hinzufügen ?

Hier ist die Build-Datei als Referenz:

    Builds client files into .jar                     <!--  -->                            

Vielen Dank im Voraus für die Hilfe!

BEARBEITEN:

Hier ist, wie die Konstruktion für meine Hauptklasse aussieht (das ist nicht die eigentliche Datei, aber das ist es, worauf ich mich stütze). Die Konstruktion ist sehr seltsam für ein Java-Programm und könnte Ant einige Probleme bereiten. Irgendwelche Empfehlungen, wie man das rekonstruiert? Ich habe eine Reihe von Fehlern, wenn ich versuche, das in mehrere Teile zu trennen. Ich habe noch nie eine Konstruktion wie diese gesehen (ja, ich verstehe, wie es funktioniert (und es tut, wenn es kompiliert wird), aber Ant mag es vielleicht nicht).

 import java.io.FileReader; import java.io.IOException; import org.supercsv.cellprocessor.Optional; import org.supercsv.cellprocessor.ParseDate; import org.supercsv.cellprocessor.ParseInt; import org.supercsv.cellprocessor.constraint.StrMinMax; import org.supercsv.cellprocessor.constraint.Unique; import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.io.CsvBeanReader; import org.supercsv.io.ICsvBeanReader; import org.supercsv.prefs.CsvPreference; class ReadingObjects { static final CellProcessor[] userProcessors = new CellProcessor[] { new Unique(new StrMinMax(5, 20)), new StrMinMax(8, 35), new ParseDate("dd/MM/yyyy"), new Optional(new ParseInt()), null }; public static void main(String[] args) throws Exception { ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE); try { final String[] header = inFile.getCSVHeader(true); UserBean user; while( (user = inFile.read(UserBean.class, header, userProcessors)) != null) { System.out.println(user.getZip()); } } finally { inFile.close(); } } } public class UserBean { String username, password, town; Date date; int zip; public Date getDate() { return date; } public String getPassword() { return password; } public String getTown() { return town; } public String getUsername() { return username; } public int getZip() { return zip; } public void setDate(final Date date) { this.date = date; } public void setPassword(final String password) { this.password = password; } public void setTown(final String town) { this.town = town; } public void setUsername(final String username) { this.username = username; } public void setZip(final int zip) { this.zip = zip; } } 

Beachten Sie, dass der Name der class tatsächlich UserBean ist und dass darin eine nicht öffentliche class namens ReadingObjects enthalten ist, die die Hauptmethode enthält.

Offenbar fehlt Ihrem classnpfad für die Laufzeit das Jar mit der class org.supercsv.io.ICsvBeanReader .

Das Problem besteht darin, dass Sie den classnpfad nicht über die Befehlszeile festlegen können, wenn Sie ein ausführbares jar aufrufen. Sie müssen es wie folgt im Manifest festlegen:

                    

Mit diesem Ansatz können Sie das JAR wie folgt ausführen:

 java -jar CC.jar 

Ohne den zusätzlichen Manifesteintrag müssen Sie das jar wie folgt ausführen:

 java -cp CC.jar:CC-DSTAMPVALUE.jar jab.jm.main.Test 

Hinweis

Nur die CC.jar ist ausführbar und benötigt das spezielle Manifest. Wenn Sie dieses Muster verwenden, werden zukünftige zusätzliche jars, die in das Verzeichnis lib gestellt werden, automatisch in den classnpfad der Laufzeit eingefügt. (Nützlich für Open-Source-Abhängigkeiten wie log4j)

Wenn Sie die CC.jar ausführen, erhalten Sie einen ähnlichen Fehler, wenn die JAR-Dateien nicht vorhanden sind 🙂

Haben Sie versucht, den classnpfad explizit anzugeben, wenn Sie das jar ausführen, um sicherzustellen, dass die neue Bibliothek darin enthalten ist?

Vielleicht ist Bibliothek 1 im Standardklassenpfad vorhanden, sodass Ihr Projekt ordnungsgemäß ausgeführt wurde, bis Sie Bibliothek 2 hinzugefügt haben, die nicht vorhanden war. Bei der Ausführung in Eclipse fügt die IDE Bibliothek 2 automatisch dem classnpfad für Sie hinzu. Sie können den classnpfad in der Ausführungskonfiguration Ihres Projekts in Eclipse überprüfen und sicherstellen, dass Sie dort alles einschließen, wenn Sie nicht über die IDE ausgeführt werden.

Dies kann aufgrund der Position der generierten classndateien geschehen. Wenn Sie also eine Through-Eclipse erstellen, werden die classndateien an dem Speicherort generiert, der als Ausgabeordner für “ex: bin” festgelegt ist. Bei der Ausführung wird dieser Speicherort für die classndateien berücksichtigt.

Überprüfe also, ob deine Ameise die classndateien am selben Ort erzeugt wie der in der BuildPath-Konfiguration erwähnte Ausgabeordner. Wenn nicht, ändern Sie den Speicherort des Ausgabeordners an den Speicherort, an dem Ihre Ant die classndateien generiert .