java.lang.NoClassDefFoundError: javax/mail/Autenticatore, che cosa è sbagliato?

Inviare a 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);
        }
    }
}

parte della mia controller.java

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

Quando eseguo la mia applicazione web ho ottenuto questo messaggio di errore che dice:

Tipo di rapporto di Eccezione

messaggio

descrizione Il server ha rilevato un
errore interno () che gli hanno impedito
dal rispondere a questa richiesta.

eccezione
javax.servlet.ServletException:
Servlet esecuzione ha generato un’eccezione

causa principale
java.lang.NoClassDefFoundError:
javax/mail/Autenticatore
controller.RegisterTenantController.doPost(RegisterTenantController.java:108)
javax.servlet.http.HttpServlet.servizio(HttpServlet.java:709)
javax.servlet.http.HttpServlet.servizio(HttpServlet.java:802)

Cosa posso fare ora? Qualcuno può aiutarmi a ottenere questa applicazione web di successo?

InformationsquelleAutor bluestella | 2009-10-27



6 Replies
  1. 26

    Mentre è possibile che questo è a causa di un jar file mancanti dal tuo classpath, potrebbe non essere.

    È importante tenere due o tre eccezioni stretto, nella nostra testa, in questo caso:

    1. java.lang.ClassNotFoundException Questa eccezione indica che la classe non è stato trovato nel classpath. Questo indica che stiamo cercando di caricare la definizione di classe e la classe non esiste nel classpath.

    2. java.lang.NoClassDefFoundError Questa eccezione indica che la JVM guardato nel suo interno la definizione della classe di struttura di dati per la definizione di una classe e non lo ha trovato. Questo è diverso da dire che potrebbe non essere caricato dal classpath. Di solito questo indica che in precedenza abbiamo cercato di caricare una classe da classpath, ma non è riuscito per qualche motivo – ora stiamo cercando di nuovo, ma non siamo nemmeno intenzione di provare a caricare, perché non siamo riusciti a caricarlo in precedenza. Il precedente fallimento potrebbe essere un ClassNotFoundException o un ExceptionInInitializerError (che indica un errore di inizializzazione statica blocco) o qualsiasi numero di altri problemi. Il punto è, un NoClassDefFoundError non è necessariamente un problema di classpath.

    Vorrei guardare il sorgente per javax.mail.Authenticator, e vedere quello che sta facendo in inizializzatore statico. (Guarda statico inizializzazione di una variabile e statico blocco, se c’è.) Se non si ottiene un ClassNotFoundException prima della NoClassDefFoundError, si è quasi garantito che si tratta di una inizializzazione statica problema.

    Ho visto simili errori abbastanza frequentemente quando il file hosts in modo non corretto definisce l’indirizzo localhost, e il blocco di inizializzazione statica si basa su InetAddress.getLocalHost(). 127.0.0.1 dovrebbe scegliere ‘localhost’ (e probabilmente anche di localhost.localdomain). NON deve scegliere il nome host della macchina (anche se per qualche motivo, molti anziani RedHat Linux installatori piaciuto per impostare in modo corretto).

  2. 20

    Aggiungere il seguente maven dipendenza

        <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>
    • con javax mail 1.5.2 mi faccia l’errore [Servlet esecuzione ha generato un’eccezione] con la causa alla radice di java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger
    • Per sfogliare le ultime versioni di vedere javax.mail & javax.attivazione
  3. 8

    Una volta mi sono imbattuto in questa situazione, e ho avuto dipendenze nel classpath. La soluzione è stata quella di includere javax.mail e javax.attivazione biblioteche del contenitore (es. tomcat) cartella lib. Utilizzando maven -impostare loro di fornito ambito di applicazione e dovrebbe funzionare. Si avranno condiviso email libs nel classpath per tutti i progetti.

    Utile fonte: http://haveacafe.wordpress.com/2008/09/26/113/

  4. 4

    Quando ho avuto questo problema, avevo incluso il mail-api.jar nel mio maven pom file. La specifica API solo. La correzione è quello di sostituire questo:

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

    con l’implementazione di riferimento di api:

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

    So che ha il sole in nome del pacchetto, ma che è l’ultima versione. Ho imparato questo da https://stackoverflow.com/a/28935760/1128668

  5. 1

    Anche io ero di fronte a un simile errore. Cercare in basso a 2 passi (il primo dei quali è stato consigliato qui già) –
    1. Aggiungere le dipendenze al 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. Se non funziona, inserire manualmente il jar file nel vostro .m2\repository\javax\<folder>\<version>\ directory.

Lascia un commento