NoClassDefFound bei "Runable Jar"

Moin,

Leider bin ich es schon wieder, diesmal habe ich ein Problem mit, wie die Überschirft schon sagt, einer NoClassDefFound Exception.

Folgende Meldung wird in der Konsole ausgegeben:

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/POIFSFileSystem
        at de.gossmann.xlsview.XlsView.main(XlsView.java:35)
        ... 5 more

Die Jar wird mit Eclipse erstellt, hier nutze ich Export → Runable Jar → Include Jars
Die Jar-Datei beinhaltet auch die POI Jar, welche die nicht gefundene Klasse beinhaltet.

Wenn ich bei mir die Jar-Datei ausführe funktioniert es wunderbar, nur auf dem Client funktioniert es nicht.
Hat jemand da eine Idee/Erfahrung woran das liegen kann? Anbei noch ein paar Daten, sowie ein Teil des Quellcodes

			POIFSFileSystem fileSystem = new POIFSFileSystem(fIn);
			HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
			HSSFSheet worksheet = workbook.getSheetAt(0);
			Iterator rows = worksheet.rowIterator();

Mein Rechner:
-Java 1.6.0_26
-Windows XP 64 Bit
-Jar läuft

Client 1:
-Java 1.4.2 (Jar wurde mit dem 1.4 Compiler erstellt)
-Linux Suse 9
-Jar läuft nicht

Client 2:
-Java 1.7.0_15
-Linux Suse 12
-Jar läuft

Leider kann die Java-Version auf den Clients nicht geändert werden :frowning:

Danke im Vorraus
Gossi

Ich würde darauf verzichten die Abhängigkeiten mit in die jar zu packen. Das führt dazu, dass ein spezieller Classloader zusätzlich mit eingebunden werden muss, der die Aufgabe hat das wieder auseinander zu fummeln.

Versuch doch zunächst mal das ganze als normale jar Datei zu erstellen, die Abhängigkeiten neben die erstellte jar zu legen und entsprechend zu starten.

[QUOTE=EikeB]Ich würde darauf verzichten die Abhängigkeiten mit in die jar zu packen. Das führt dazu, dass ein spezieller Classloader zusätzlich mit eingebunden werden muss, der die Aufgabe hat das wieder auseinander zu fummeln.

Versuch doch zunächst mal das ganze als normale jar Datei zu erstellen, die Abhängigkeiten neben die erstellte jar zu legen und entsprechend zu starten.[/QUOTE]

Werd ich sobald ich Zeit habe versuchen, was mich aber wundert ist, dass das Programm bis vor ca. 1 Woche noch lief, sich seither aber nichts verändert hat, wurde mir zumindest gerade mitgeteilt…

von diesem “es hat sich nichts geändert” kann ich ein täglich liedchen singen
bei uns in der firma kracht es dauernt, und das obwohl “alles wie immer im grünen bereich” ist
wobei, das geht dann bei anfänger-fehlern los das man anstatt “if(object==null)” lieber “catch(NullPointerException)” in den code packt (zumindest dem stack-trace zu folge)

was ich mal ganz stark behaupten würde : du nutzt die LIBs als binary, also hast bereits fertig compilete class-files …
und da kann es dann durch aus mal zu kommen das diese mit einer neueren version erstellt wurden als die vm auf dem ziel-system verfügbar ist
also das z.b. deine poi.jar mit 5 oder 6 compiled wurde und deshalb einfach nicht auf einer 1.4.2er VM läuft … (wobei die fehlermeldung dann eine andere wäre)

und wie auch schon hier und in einem anderen thema erwähnt : verlass dich nicht auf eclipse jar-in-jar … sondern machs richtig über den classpath und externem lib-folder

[QUOTE=Unregistered]was ich mal ganz stark behaupten würde : du nutzt die LIBs als binary, also hast bereits fertig compilete class-files …
und da kann es dann durch aus mal zu kommen das diese mit einer neueren version erstellt wurden als die vm auf dem ziel-system verfügbar ist
also das z.b. deine poi.jar mit 5 oder 6 compiled wurde und deshalb einfach nicht auf einer 1.4.2er VM läuft … (wobei die fehlermeldung dann eine andere wäre)[/QUOTE]

Was mich aber trotzdem wundert, es hat sich weder an dem Jar-File (das gibt es seit > 1 Jahr), noch an der Java-Version etwas geändert, habe es nochmals überprüft, Ordner ist komplett, letzte Änderung am 15.11.2012, danach wurde das Program aber noch mehrfach genutzt.

Zu dem Thema Classpath: Ja, darüber habe ich schon nachgedacht, Problem ist aber, dass ich nur Schreibrechte auf dem Ordner habe, indem meine Jar liegt, den Rest des Dateisystems darf ich nicht anrühren, ich kann den Classpath auch schlecht direkt in den Code packen, da er auf mehreren Clients in unterschiedlichen Ordnern liegt…
Oder kann ich im Classpath auch angeben, dass er den aktuellen Ordner benutzen soll?

Oder kann ich im Classpath auch angeben, dass er den aktuellen Ordner benutzen soll?

Ja, mit einem Punkt.

Getestet habe ich:
java -jar xls2txt.jar test.xls -cp .
java -jar xls2txt.jar test.xls -cp .*
java -jar xls2txt.jar test.xls -cp .\poi-3.0.2-FINAL-20080204.jar
java -cp . -jar xls2txt.jar test.xls
java -cp .* -jar xls2txt.jar test.xls
java -cp .\poi-3.0.2-FINAL-20080204.jar -jar xls2txt.jar test.xls

java -cp poi-3.0.2-FINAL-20080204.jar -jar xls2txt.jar test.xls
java -jar xls2txt.jar test.xls -cp poi-3.0.2-FINAL-20080204.jar

Überall der gleiche Fehler :ka:

*** Edit ***

PS:

Mit -classpath natürlich auch getestet

Wenn du den -jar Parameter nutzt kannst du -cp nicht mehr verwenden. Es wird dann das Class-Path Attribut des Manifests ausgewertet.

Ah, das erklärts, danke werd ich gleich testen.

Edit:
So, gebastelt, getestet, funzt, zumindest auf meinem Rechner, auf den Clients kann ich grad nicht testen, aber danke an alle für die Hilfe

Und es reicht dann nicht der Punkt im Classpath, sondern du musst das jar angeben also eher sowas wie java -cp ./xls2txt.jar;./poi.jar deine.main.class test.xls
Oder auch wie geschrieben mit java -jar dann im Manifest das jar direkt angeben.
Class-Path: poi.jar

@Gossi
ja, genau DAS hab ich gemeint
du packst die lib-jars einfach mit in den selben ordner (oder einen unter-ordner “lib”) und gibst diese dann im manifest an
von allem anderen war auch nie die rede

und ja, ich glaub dir ja das sich “nichts” verändert haben soll, aber irgendwas muss ja einfach anders sein im gegensatz zu dem zeitpunkt als es das letzte mal funktioniert hat

und auf die frage, ob deine libs auch alle für 1.4 sind hast du auch nicht geantwortet, weshalb ich DAS weiterhin als möglichen fehler nenne