Java.lang.Noclassdeffonderror: javax/mail / Authenticator, qu'est-ce qui ne va pas?

envoyer par courriel.java

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 = "sample@gmail.com",
     d_password = "mysamplepassword",
     d_host = "smtp.gmail.com",
     d_port  = "465",
     //m_to = "sample@yahoo.com",
     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 contrôleur.java

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

quand j'exécute mon application web j'ai reçu ce message d'erreur disant:

Type de rapport D'Exception

message

description Le serveur a rencontré une erreur interne () qui l'a empêché de répondre à cette demande.

exception javax.servlet.ServletException: Servlet l'exécution a déclenché une exception

root cause Java.lang.Noclassdeffonderror: javax/mail/Authentificateur contrôleur.Registrenttenantcontroller.doPost (Registrertenantcontroller.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 à réussir cette application web?

30
demandé sur bluestella 2009-10-27 13:45:55

5 réponses

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

46
répondu David Rabinowitz 2009-10-27 17:01:45

bien qu'il soit possible que cela soit dû à un fichier jar manquant dans votre chemin de classe, ce n'est peut-être pas le cas.

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ée sur le chemin de la classe. Cela indique que nous essayions de charger la définition de classe, et la classe n'existait pas sur le classpath.

  2. java.lang.NoClassDefFoundError cette exception indique que la JVM a cherché dans sa structure interne de données de définition de classe la définition d'une classe et ne l'a pas trouvée. Ceci est différent de dire qu'il ne pouvait pas être chargé à partir du chemin de classe. Habituellement, cela indique que nous avons déjà essayé de charger une classe à partir du chemin de classe, mais il a échoué pour une raison quelconque - maintenant, nous essayons à nouveau, mais nous n'allons même pas essayer de le charger, parce que nous échec de chargement plus tôt. L'échec précédent pourrait être un ClassNotFoundException ou un ExceptionInInitializerError (indiquant une défaillance dans le bloc d'initialisation statique) ou tout autre problème. Le fait est, a NoClassDefFoundError n'est pas nécessairement un problème de classpath.

j'allais le chercher à la source pour l' javax.mail.Authenticator, et voir ce qu'il fait dans son initialiseur statique. (Regardez l'initialisation de la variable statique et le bloc statique, s'il y en a un.) Si vous n'obtenez pas un ClassNotFoundException avant la NoClassDefFoundError, vous êtes presque sûr que c'est un problème d'initialisation statique.

j'ai vu des erreurs similaires assez fréquemment lorsque le fichier hosts définit incorrectement l'adresse localhost, et que le bloc d'initialisation statique s'appuie sur InetAddress.getLocalHost(). 127.0.0.1 doit pointer vers 'localhost' (et probablement aussi localhost.localdomain). Il ne devrait pas pointer vers le nom d'hôte réel de la machine (bien que pour une raison quelconque, de nombreux anciens installateurs RedHat Linux ont aimé le définir incorrectement.)

25
répondu Jared 2013-06-17 16:32:00

ajouter suite à 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>
20
répondu Koray Güclü 2012-08-13 23:29:53

j'ai déjà couru dans cette situation et j'avais les dépendances dans classpath. La Solution était d'inclure javax.mail et javax.bibliothèques d'activation dans les conteneurs (par ex. tomcat) dossier lib. Avec maven, vous définissez condition portée et ça devrait marcher. Vous aurez partagé des liens e-mail dans classpath pour tous les projets.

source utile:http://haveacafe.wordpress.com/2008/09/26/113/

8
répondu zeratul021 2011-09-13 23:29:31

quand j'ai eu ce problème, j'avais inclus le . La solution est de remplacer ceci:

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

avec l'implémentation de référence de l'api:

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

je sais qu'il a le soleil dans le nom du package, mais c'est la version la plus récente. J'ai appris cela de https://stackoverflow.com/a/28935760/1128668

4
répondu GlenPeterson 2017-05-23 11:47:01