NoClassDefFoundError

Hallo liebe Experten,

nun läuft das Servlet auf meinem neuen eclipse. allerdings gibt es noch eine Kleinigkeit.

Das Programm wirft eine Exception

Exception in thread "Thread-33" java.lang.NoClassDefFoundError: javax/mail/Address

Das Die Bibliothek mail.jar liegt im Pfad

C:\Programme\eclipse\libraries\javamail-1.4.1\

Deshalb habe ich den CLASSPATH ergänzt.

CLASSPATH=
C:\Programme\Java\jdk1.5.0\_16\src;C:\Programme\eclipse\libraries\javamail-1.4.1\

An was könnte es noch liegen?

Danke für die Mühe
und tschüs
Uwe

Moin,

haben Sie die Library in Ihr Projekt innerhalb Eclipse mit eingebunden?
Eventuell beachtet Eclipse den classpath nicht, da dieser ja eigens vom Programm verwaltet wird.
Abhilfe könnte hier die Aufnahme der jar-Datei in das Projekt helfen:
Rechtklick auf’s Projekt -> build path -> add external libary.
Außerdem könnte es sein, dass der classpath explizit das jar anzeigen muss, sprich ein normaler Pfad zum jar-Ordner nicht ausreichend ist.
Liegt die Library exakt in dem Ordner oder in weiteren untergeordneten?

Gruß,
Puni

Hallo Puni,

danke für die schnelle Antwort.

haben Sie die Library in Ihr Projekt innerhalb Eclipse mit
eingebunden?

In Java Build Path steht im Register Libraries

mail.jar - C:\Programme\eclipse\libraries\javamail.1.4.1



> Außerdem könnte es sein, dass der classpath explizit das jar  
> anzeigen muss, sprich ein normaler Pfad zum jar-Ordner nicht  
> ausreichend ist.

Den CLASSPATH habe ich wie folgt geändert.


    C:\Programme\Java\jdk1.5.0\_16\src;C:\Programme\eclipse\libraries\javamail-1.4.1\mail.jar


Leider ohne Erfolg.



> Liegt die Library exakt in dem Ordner oder in weiteren  
> untergeordneten?

Der exakte Pfad heißt:


    C:\Programme\eclipse\libraries\javamail.1.4.1\mail.jar



Gruß
Uwe

Moin,

das ist wirklich komisch.
Wenn in der Library die Klasse wirklich nicht gefunden werden kann,
selbst wenn diese im build path eingebunden ist,
dann lässt sich von meiner Seite nur darauf schließen,
dass die Library fehlerhaft ist und die geforderte Klasse gar nicht beinhaltet.

Eventuell extrahieren Sie einmal die jar-Datei und schauen selbst nach,
ob alle Packete darin vorhanden sind.
Anders lässt es sich kaum erklären - wenn schon im build path UND im classpath.

Gruß,
Puni

Hallo Puni,

das ist wirklich komisch.

Das ist es.

Etwas ausführlicher heißt die Exception

Exception in thread "Thread-36" java.lang.NoClassDefFoundError: javax/mail/Address
 at gb3.util.SendMail.sendMessageAutoDelete(SendMail.java:220)
 at gb3.util.SendMail.(SendMail.java:41)
 at gb3.util.Cleaning.run(Cleaning.java:98)

Die Zeile in SendMail.java:220 heißt

new Mailer(emailFirst, emailLast, subject, textMail).start();

In der Klasse Mailer gibt es folgende Importe

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

Eventuell extrahieren Sie einmal die jar-Datei und schauen
selbst nach, ob alle Packete darin vorhanden sind.

Im WinRAR öffne ich folgenden Pfad
mail.jar\javax\mail - ZIP Archiv, ungepackte Größe 647.018 Bytes
und finde

Message.class
Session.class
Store.class
Transport.class

Im Ordner
mail.jar\javax\mail\internet - ZIP Archiv, ungepackte Größe 647.018 Bytes
finde ich

InternetAddress.class
MimeMessage.class

Für mich sieht das so aus, als wenn alles da wäre.

Anders lässt es sich kaum erklären - wenn schon im build path
UND im classpath.

So geht es mir auch.
Zumal der Compiler fehlerfrei compiliert. Das lässt mich vermuten, dass ich auch die richtige mail.jar habe. Kann es trotzdem die falsche sein?

Das Projekt ist auf dem alten PC fehlerfrei gelaufen.
Allerdings habe ich es in der neuen eclipse-Version neu aufgesetzt.

Was nun ???

Gruß
Uwe

Moin,

Diese Zeile

Exception in thread „Thread-36“ java.lang.NoClassDefFoundError: javax/mail/Address

sagt eigentlich eindeutig aus, dass die Klasse „Address“ nicht gefunden werden kann.
Ist die besagte Klasse denn auch vorhanden, in der Library?
Irgendwie muss ja auf diese Klasse zugegriffen werden, aber in den imports steht sie ja nicht mit bei.

Gruß,
Puni

1 Like

Hallo Puni,

danke, dass du noch nicht aufgegeben hast.

Diese Zeile

Exception in thread „Thread-36“ java.lang.NoClassDefFoundError: javax/mail/Address

sagt eigentlich eindeutig aus, dass die Klasse „Address“ nicht
gefunden werden kann.

Hier habe ich Zweifel. Ich habe das ganze Projekt durchsuchen lassen. Auf eine Klasse „Address“ wird definitiv nicht zugegriffen.

Ist die besagte Klasse denn auch vorhanden, in der Library?

Nein, die Klasse gibt es dort nicht.

Irgendwie muss ja auf diese Klasse zugegriffen werden, aber in
den imports steht sie ja nicht mit bei.

Das lässt mich vermuten, dass „Address“ für eine beliebige Adresse steht.

Inzwischen habe ich ein wenig Unsinn angestellt.
Ich hoffe, wir bekommen das wieder hin.

Es gibt da noch eine zweite Bibliothek, die ich eingebunden hatte.
Sie heisst activation.jar
Diese habe ich im CLASSPATH bekannt gemacht.
Leider keine Besserung.

Nun habe ich sie aus den Java Build Path/Libraries/ entfernt,
um zu sehen, wofür sie ist. Offenbar ist sie notwendig.
Also habe ich sie wieder mit „Add Externel JARs …“ den Libraries hinzu gefügt.
Das gleiche habe ich mit mail.jar gemacht.
Dann habe ich versucht, die Variable ECLIPSE_HOME zu erweitern, mit dem Pfad für mail.jar und activation.jar

Leider habe ich jetzt diese drei Warnungen im eclipse:

Classpath entry ECLIPSE\_HOME will not be exported or published. Runtime ClassNotFoundExceptions may result.
Classpath entry C:/Programme/eclipse/libraries/javamail-1.4.1/mail.jar will not be exported or published. Runtime ClassNotFoundExceptions may result. 
Classpath entry C:/Programme/eclipse/libraries/jaf-1.1.1/activation.jar will not be exported or published. Runtime ClassNotFoundExceptions may result.

Wie bekomme ich die wieder weg?

Gruß
Uwe

Zumal der Compiler fehlerfrei compiliert. Das lässt mich
vermuten, dass ich auch die richtige mail.jar habe. Kann es
trotzdem die falsche sein?

Moment, Moment? Die Kompilierung funktioniert einwandfrei? Nur das Starten klappt nicht?

Ich denke mal, dass du beim Starten die Library nicht richtig eingebunden hast. Wie startest du das Projekt denn?

Exception in thread „Thread-36“ java.lang.NoClassDefFoundError: javax/mail/Address

sagt eigentlich eindeutig aus, dass die Klasse „Address“ nicht
gefunden werden kann.

Hier habe ich Zweifel. Ich habe das ganze Projekt durchsuchen
lassen. Auf eine Klasse „Address“ wird definitiv nicht
zugegriffen.

Doch. Du hast einen Import „InternetAddress“ in deiner Mailer-Klasse. Und InternetAddress ist von Address abgeleitet. Guckst du mal in die API-Doku:
http://java.sun.com/products/javamail/javadocs/javax…

Ist die besagte Klasse denn auch vorhanden, in der Library?

Nein, die Klasse gibt es dort nicht.

Dann kann es auch nicht funktionieren.
Ich habe mir hier gerade mal die JavaMail Library runtergeladen:
http://java.sun.com/products/javamail/downloads/inde…

Wenn ich die mail.jar entpacke, dann gibt es dort im Ordner javax/mail die Klasse Address.class

Ohne die funktioniert das natürlich nicht.

Leider habe ich jetzt diese drei Warnungen im eclipse:

Classpath entry ECLIPSE_HOME will not be exported or
published. Runtime ClassNotFoundExceptions may result.
Classpath entry
C:/Programme/eclipse/libraries/javamail-1.4.1/mail.jar will
not be exported or published. Runtime ClassNotFoundExceptions
may result.
Classpath entry
C:/Programme/eclipse/libraries/jaf-1.1.1/activation.jar will
not be exported or published. Runtime ClassNotFoundExceptions
may result.

Wie bekomme ich die wieder weg?

In dem du die Libraries nicht als externe JARs einbindest, sondern die JAR-Dateien deinem Projekt hinzufügtst (z.B. in einen Ordner „lib“ innerhalb deines Projekts) und sie dann nicht mit „Add external Jar“ sondern nur mit „Add Jar“ deinem Build-Path hinzufügst.

1 Like

Hallo deconstruct,

juchhu, es funktioniert. Dafür gibt es ein Sternchen.

Der Grund:

In dem du die Libraries nicht als externe JARs einbindest,
sondern die JAR-Dateien deinem Projekt hinzufügtst (z.B. in
einen Ordner „lib“ innerhalb deines Projekts)

Danach lief das gesamte Programm fehlerfrei.

und sie dann nicht mit „Add external Jar“
sondern nur mit „Add Jar“ deinem :Build-Path hinzufügst.

War gar nicht nötig. In den Libraries gibt es einen Eintrag
„Web App Libraries“. Darunter sind beide Klassen zu finden,
sobals sie im Ordner WEB-INF/lib/ abgelegt sind.

Resümee:

Wenn ich die mail.jar entpacke, dann gibt es dort im Ordner
javax/mail die Klasse Address.class
Ohne die funktioniert das natürlich nicht.

Die Klasse „Address“ war immer da. Ich habe sie nur nicht gesehen.

Leider habe ich jetzt diese drei Warnungen im eclipse:

Die für mail.jar und die für activation.jar waren sofort verschwunden.

Übrig bleibt diese Warnung:

Classpath entry ECLIPSE_HOME will not be exported or
published. Runtime ClassNotFoundExceptions may result.

Hast du dafür noch eine Idee?

Gruß
Uwe

Hallo Puni,

danke für die Unterstützung.

Gruß
Uwe

War gar nicht nötig. In den Libraries gibt es einen Eintrag
„Web App Libraries“. Darunter sind beide Klassen zu finden,
sobals sie im Ordner WEB-INF/lib/ abgelegt sind.

Ach, das ist eine Web-Anwendung. Das habe ich wohl überlesen. Der Web App Libraries Ordner ist genau dazu gemacht, dort die Libraries abzulegen, die deine Web-Anwendung braucht. Wenn du die Anwendung z.B. als WAR-File exportierst, dann sind diese Libraries automatisch mit dabei und es sollte in jedem Application-Server (Tomat, etc) laufen.

Übrig bleibt diese Warnung:

Classpath entry ECLIPSE_HOME will not be exported or
published. Runtime ClassNotFoundExceptions may result.

Hast du dafür noch eine Idee?

Ja, wirf den Eintrag einfach aus dem Classpath raus. Ich wüßte nicht, wozu du ihn bräuchtest.

Hallo deconstruct,

Warnung: Classpath entry ECLIPSE_HOME will not be exported

Hast du dafür noch eine Idee?
Ja, wirf den Eintrag einfach aus dem Classpath raus. Ich wüßte
nicht, wozu du ihn bräuchtest.

Das war einfach. Danke.

Zur Vollständigkeit, für alle, die später mal das gleiche Problem haben:
Die Einträge für mail.jar und activation.jar habe ich aus dem Windows-CLASSPATH entfernt. Eclipse verwaltet das alles selbst, wenn die Bibliotheken im Ordner WEB-INF/lib/ liegen.

Dir, deconstruct, noch einen angenehmen Sonntag abend
und tschüs
Uwe