web-dev-qa-db-fra.com

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

Envoyer à Email.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 = "[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);

Lorsque j'exécute mon application Web, j'ai reçu ce message d'erreur disant:

Rapport d'exception de type

message

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

exception javax.servlet.ServletException: l'exécution du servlet a levé une exception

cause racine Java.lang.NoClassDefFoundError: javax/mail/Authenticator controller.RegisterTenantController.doPost (RegisterTenantController.Java:108) javax.servlet.http.HttpServlet.service (HttpServlet.Java:709) javax.servlet.Service.ttp (HttpServlet.Java:802)

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

31
bluestella

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

47
David Rabinowitz

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 différentes 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 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 recherché dans sa structure de données de définition de classe interne la définition d'une classe et ne l'a pas trouvée. C'est différent de dire qu'il n'a pas pu être chargé à partir du chemin de classe. Habituellement, cela indique que nous avons précédemment tenté de charger une classe à partir du chemin de classe, mais cela a échoué pour une raison quelconque - maintenant nous essayons à nouveau, mais nous n'allons même pas essayer de la charger, car nous avons échoué à la charger plus tôt. L'échec antérieur peut être un ClassNotFoundException ou un ExceptionInInitializerError (indiquant une panne dans le bloc d'initialisation statique) ou un certain nombre d'autres problèmes. Le fait est qu'un NoClassDefFoundError n'est pas nécessairement un problème de chemin de classe.

Je regarderais la source de javax.mail.Authenticator, Et verrais ce qu'il fait dans son initialiseur statique. (Regardez l'initialisation des variables statiques 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'une initialisation statique problème.

J'ai vu des erreurs similaires assez fréquemment lorsque le fichier hosts définit de manière incorrecte l'adresse localhost et que le bloc d'initialisation statique s'appuie sur InetAddress.getLocalHost(). 127.0.0.1 devrait pointer vers "localhost" (et probablement aussi localhost.localdomain). Il ne doit 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 aimaient le définir incorrectement).

26
Jared

Ajoutez des éléments suivants à 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
Koray Güclü

J'ai exécuté une fois dans cette situation et j'avais les dépendances dans classpath. La solution consistait à inclure les bibliothèques javax.mail et javax.activation dans le dossier lib du conteneur (par exemple Tomcat). Avec maven, vous les définirez sur la portée fournie et cela devrait fonctionner. Vous aurez partagé des bibliothèques de messagerie dans classpath pour tous les projets.

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

8
zeratul021

Quand j'ai eu ce problème, j'avais inclus le mail-api.jar dans mon fichier pom maven. C'est la spécification API uniquement . Le correctif consiste à 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 cette api:

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

Je sais que Sun contient le nom du package, mais c'est la dernière version. J'ai appris cela de https://stackoverflow.com/a/28935760/1128668

4
GlenPeterson

Même moi, je faisais face à une erreur similaire. Essayez ci-dessous 2 étapes (dont la première a déjà été recommandée ici) - 1. Ajoutez les dépendances à votre pom.xml

         <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. Si cela ne fonctionne pas, placez manuellement les fichiers jar dans votre .m2\repository\javax\<folder>\<version>\ répertoire.
0
Manan Shah