2009-10-27 3 views
30

Envoyer à Email.javajava.lang.NoClassDefFoundError: javax/mail/Authenticator, quoi de mal?

package helper; 

//Mail.java - smtp sending starttls (ssl) authentication enabled 
//1.Open a new Java class in netbeans (default package of the project) and name it as "Mail.java" 
//2.Copy paste the entire code below and save it. 
//3.Right click on the file name in the left side panel and click "compile" then click "Run" 

import javax.mail.*; 
import javax.mail.internet.*; 
import java.util.*; 

public class sendToEmail 
{ 
    String d_email = "[email protected]", 
    d_password = "mysamplepassword", 
    d_host = "smtp.gmail.com", 
    d_port = "465", 
    //m_to = "[email protected]", 
    m_subject = "trial", 
    m_text = "Hey, this is the testing email."; 

    public sendToEmail(String strEmailAddress) 
    { 


     Properties props = new Properties(); 
     props.put("mail.smtp.user", d_email); 
     props.put("mail.smtp.host", d_host); 
     props.put("mail.smtp.port", d_port); 
     props.put("mail.smtp.starttls.enable","true"); 
     props.put("mail.smtp.auth", "true"); 
     //props.put("mail.smtp.debug", "true"); 
     props.put("mail.smtp.socketFactory.port", d_port); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 

     SecurityManager security = System.getSecurityManager(); 

     try 
     { 
      Authenticator auth = new SMTPAuthenticator(); 
      Session session = Session.getInstance(props, auth); 
      //session.setDebug(true); 

      MimeMessage msg = new MimeMessage(session); 
      msg.setText(m_text); 
      msg.setSubject(m_subject); 
      msg.setFrom(new InternetAddress(d_email)); 
      msg.addRecipient(Message.RecipientType.TO, new InternetAddress(strEmailAddress)); 
      Transport.send(msg); 
     } 
     catch (Exception mex) 
     { 
      mex.printStackTrace(); 
     } 
    } 

    public class SMTPAuthenticator extends javax.mail.Authenticator 
    { 
     public PasswordAuthentication getPasswordAuthentication() 
     { 
      return new PasswordAuthentication(d_email, d_password); 
     } 
    } 
} 

partie de mon controller.java

/* Send to Email will run properly soon */ 
      sendToEmail email = new sendToEmail(strEmailAddress); 

Quand je lance mon application web je reçu ce message d'erreur disant:

Type Exception report

message

description The server encountered an internal error() that prevented it from fulfilling this request.

exception javax.servlet.ServletException: Servlet execution threw an exception

root cause java.lang.NoClassDefFoundError: javax/mail/Authenticator controller.RegisterTenantController.doPost(RegisterTenantController.java:108) javax.servlet.http.HttpServlet.service(HttpServlet.java:709) javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Que vais-je faire maintenant? Quelqu'un peut-il m'aider à faire réussir cette application web?

Répondre

45

Vous devez ajouter deux pots dans le répertoire WEB-INF/lib ou votre webapp (ou le répertoire lib du serveur):

25

Bien qu'il soit possible que cela soit dû à un fichier JAR manquant dans votre chemin de classe, il se peut qu'il ne le soit pas.

Il est important de garder deux ou trois exceptions détroit dans notre tête dans ce cas:

  1. java.lang.ClassNotFoundException Cette exception indique que la classe n'a pas été trouvé sur le chemin de classe. Cela indique que nous essayions de charger la définition de classe, et que la classe n'existait pas sur le chemin de classe.

  2. java.lang.NoClassDefFoundError Cette exception indique que la machine virtuelle Java a regardé dans sa structure de données de définition de classe interne pour la définition d'une classe et ne pas le trouver. Ceci est différent de dire qu'il n'a pas pu être chargé à partir du classpath. Cela indique généralement que nous avons précédemment tenté de charger une classe à partir du classpath, mais cela a échoué pour une raison quelconque - nous essayons à nouveau, mais nous n'allons même pas essayer de le charger, car nous avons échoué à le charger plus tôt. L'échec précédent peut être un ClassNotFoundException ou un ExceptionInInitializerError (indiquant une défaillance dans le bloc d'initialisation statique) ou un nombre quelconque d'autres problèmes. Le point est, un NoClassDefFoundError n'est pas nécessairement un problème de classpath.

je regardais à la source pour javax.mail.Authenticator, et de voir ce qu'il fait dans son initialiseur statique. (Regardez l'initialisation de variable statique et le bloc statique, s'il y en a un.) Si vous n'obtenez pas un ClassNotFoundException avant le NoClassDefFoundError, vous êtes presque assuré qu'il s'agit d'un problème d'initialisation statique.

J'ai souvent vu des erreurs similaires lorsque le fichier hosts définit de manière incorrecte l'adresse localhost, et le bloc d'initialisation statique repose sur InetAddress.getLocalHost(). 127.0.0.1 devrait pointer vers 'localhost' (et probablement aussi localhost.localdomain). Il ne doit PAS pointer sur le nom d'hôte réel de la machine (bien que, pour une raison ou pour une autre, de nombreux installateurs RedHat Linux plus anciens aient aimé le définir de manière incorrecte).

8

Une fois j'ai couru dans cette situation et j'ai eu les dépendances dans classpath. La solution était d'inclure javax.mail et javax.bibliothèques d'activation dans le dossier lib du conteneur (par exemple, tomcat). Avec maven vous les mettre à fourni portée et cela devrait fonctionner. Vous aurez partagé les bibliothèques d'email dans classpath pour tous les projets.

sources utiles: http://haveacafe.wordpress.com/2008/09/26/113/

18

Ajouter suivante à votre dépendance Maven

<dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>mail</artifactId> 
     <version>1.4.5</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.activation</groupId> 
     <artifactId>activation</artifactId> 
     <version>1.1.1</version> 
    </dependency> 
+1

avec le courrier javax 1.5.2 I face à l'erreur [exécution Servlet a lancé une exception] avec la cause racine java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger –

+1

Pour parcourir les dernières versions voir [javax.mail] (http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22javax.mail%22%20AND%20a%3A%22mail%22) & [javax.activation] (http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22javax.activation%22%20AND%20a%3A%22activation%22) –

2

Quand j'ai eu ce problème, je l'avais inclus le mail-api.jar dans mon dossier maven pom. C'est la spécification API seulement. La solution est de remplacer:

<!-- DO NOT USE - it's just the API, not an implementation --> 
<groupId>javax.mail</groupId> 
<artifactId>javax.mail-api</artifactId> 

avec la mise en œuvre de référence de cette api:

<groupId>com.sun.mail</groupId> 
<artifactId>javax.mail</artifactId> 

Je sais qu'il a le soleil dans le nom du package, mais qui est la dernière version. Je l'ai appris de https://stackoverflow.com/a/28935760/1128668

Questions connexes