# Jar mit Abhängigkeiten ausführen -> NoClassDefFound Error



## flaffy (9. Jun 2005)

Hallo 

Ich hätte da mal eine Frage...

Ich habe mir ein kleines Programm geschrieben das auf ein paar anderen Jars von Jakarta (commons-email, commons-lang, activation) und der Java Mail Api aufbaut. Und mein Programm habe ich schön brav in ein Jar gepackt.

Wenn ich es jetzt unter Linux ausführen möchte...

java -classpath .:/classpath/mail.jar:/classpath/...usw. -jar MeinJar.jar

... erhalte ich eine NoClassDefFound Exception, da er die Klassen in den Jars auf die meine Anwendung zugreift, nicht finden kann...  Die Klassen sind allerdings in den über -classpath angegebenen Jars vorhanden.

Ich habe derzeit die ganzen Jars in den ext Ordner meiner Java Installation gepackt - das funktioniert zwar, ist aber nicht das was ich eigentlich wollte 

Berechtigungen für die einzelnen Jars sind ebenfalls gesetzt (Testweise auf jeder lesen/schreiben/ausführen).

Woran kann es liegen das er die Jars im -classpath vollkommen ignoriert?


----------



## Guest (9. Jun 2005)

bist du sicher das du die jars in /classpath gespeichert hast? oder nicht doch etwa in ~/irgeneinpafd?

kind regards


----------



## flaffy (9. Jun 2005)

Die Pfade sind korrekt - das ist ja genau das was mich wundert....


----------



## thE_29 (9. Jun 2005)

Dein Pfad heißt classpath????


----------



## flaffy (9. Jun 2005)

Nein das Verzeichnis heisst classpath...


/classpath/mail.jar ...
/classpath/irgendein.jar

Ich könnte das Verzeichnis natürlich auch nach demjenigen benennen, der mir eine Antwort auf mein Problem geben kann 

z.B. ... /DeinName/irgendein.jar 

...Wobei sich immernoch die Frage stellt warum er die angegebenen Jars ignoriert  Hatte das Problem noch niemand unter Linux?


----------



## thE_29 (9. Jun 2005)

Kommt den eine noClassDefFound Error von einer Klasse die in den jar Files sein sollten??

Oder eine andere?? (Vielleicht falsche Version?)


----------



## messi (9. Jun 2005)

Man kann "java" nicht mit -classpath und -jar kombiniert aufrufen. Entweder, oder.


----------



## thE_29 (10. Jun 2005)

Oha, na dann musst du das so machen!!

java -classpath .:/classpath/mail.jar:/classpath/...usw.:MeinJar.jar mein.package.pfad.zur.main.class

So sollte das hinhaun!!


----------



## flaffy (10. Jun 2005)

> Kommt den eine noClassDefFound Error von einer Klasse die in den jar Files sein sollten??
> 
> Oder eine andere?? (Vielleicht falsche Version?)



Das kommt von meinem Programm. Es kann eine abhängige Klasse in einem der angegebenen Jars nicht finden (wenn die abhängigen Jars z.B. im ext-Verzeichnis liegen funktioniert es wunderbar).



> Man kann "java" nicht mit -classpath und -jar kombiniert aufrufen. Entweder, oder.



Das wär mir sehr sehr neu...wie soll man denn sonst andere Abhängigkeiten erfüllen? Per export oder set?



> Oha, na dann musst du das so machen!!
> 
> java -classpath .:/classpath/mail.jar:/classpath/...usw.:MeinJar.jar mein.package.pfad.zur.main.class
> 
> So sollte das hinhaun!!



So hatte ich es auch  Nur das ich die Main-Class schon in das Manifest eingetragen habe.

Aaaaaaaaaaber es funktioniert einfach nicht...ich hab auch schon gegoogelt und jeder macht es ebenfalls so...aber...es will einfach nicht...

Muss ich das vielleicht mit irgendwelchen -Dsystem Parametern angeben?


----------



## flaffy (10. Jun 2005)

Hier z.B. unter Windows:


```
java -classpath ".;c:\test\mail.jar;c:\test\commons-lang-2.0.jar;c:\test\activation.jar" -jar SimpleMail-alpha.jar

pause
```

Und das Ergebnis...


```
C:\Test>java -classpath ".;c:\test\mail.jar;c:\test\commons-lang-2.0.jar;c:\test\activation.jar" -jar SimpleMail-alpha.jar
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
        at net.flaffy.SimpleMail.main(SimpleMail.java:63)

C:\Test>pause
Drücken Sie eine beliebige Taste . . .
```


----------



## thE_29 (10. Jun 2005)

Mh, hast du die javaxmail Librarys eingebunden oder ist das in mail.jar drinnen??

Bild mir ein, die mail Sachen haben ja mehrere Jar Files!


----------



## messi (10. Jun 2005)

flaffy hat gesagt.:
			
		

> messi hat gesagt.:
> 
> 
> 
> ...



Das ist nicht neues. Aber du kannst z.B. ins Manifest folgendes aufnehmen: Class-Path: a.jar b.jar c.jar


----------



## thE_29 (10. Jun 2005)

Hab gerade getestet und mit Classpath geht das einfach net!

Enteweder du machst es so wie ich mit meine.klasse.main

oder du fügst es im Manifest-MF hinzu!


----------



## flaffy (10. Jun 2005)

Mmmhhhhhh so langsam glaube ich messi hatte Recht 

Ich hab es jetzt so gelöst (erstmal unter Windows)...


```
java -Djava.endorsed.dirs=c:\test\ -jar SimpleMail-alpha.jar
```

Ich geb einfach *-Djava.endorsed.dirs=pfad* an. Dann kann ich die Jars irgendwo hinpacken...funktioniert unter Linux und Windows


----------



## thE_29 (10. Jun 2005)

Nur so ne Frage!

Wie bistn auf das gekommen??


----------



## flaffy (10. Jun 2005)

Ich hab mir einfach angeschaut wie die das beim Tomcat machen. Denn wenn du den unter Linux unter einem anderen Benutzernamen ausführen möchtest, musst du vorher einen jsvc (auch im Tomcat Verzeichnis) Service starten. Und dem musst du diverse -D Parameter weiterleiten - u.a. auch "Classpath" und die eigentliche Jar Datei


----------



## saz (21. Feb 2007)

Hallo,
ich habe ein ähnliches Problem wie hier beschreiben, aber weiss nicht so ganz, ob es tatsächlich 100% zutrifft. 

Bei mir habe ich 2 jar-Dateien importiert, die soweit im Eclipse auch verfügbar sind, aber wenn ich sie versuche in einem thread in einem Applet aufzurufen (nachdem ich sie als *.war exportiert habe), kommt der Fehler NoClassDefFound für eine Klasse, die sich in einer der jar-Dateien befindet. Muss ich da die jar-Dateien auch als Plugin machen?


----------

