2009-10-27 18 views
30

Enviar a Email.javajava.lang.NoClassDefFoundError: javax/mail/Authenticator, cuál es incorrecto?

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 de mi controller.java

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

Cuando ejecuto mi aplicación web Tengo este mensaje de error que dice:

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)

¿Qué haré ahora? ¿Alguien puede ayudarme a obtener esta aplicación web con éxito?

Respuesta

45

es necesario agregar dos frascos en el directorio WEB-INF/lib o su aplicación Web (o el directorio lib del servidor):

25

Si bien es posible que esto se deba a que falta un archivo jar de classpath, puede que no lo sea.

Es importante tener dos o tres excepciones diferentes estrecho en nuestra cabeza, en este caso:

  1. java.lang.ClassNotFoundException Esta excepción indica que la clase no se encontró en la ruta de clase. Esto indica que estábamos tratando de cargar la definición de la clase, y la clase no existía en la ruta de clases.

  2. java.lang.NoClassDefFoundError Esta excepción indica que la JVM se veía en su estructura de datos de definición de clase interna para la definición de una clase y no lo encontró. Esto es diferente a decir que no se pudo cargar desde classpath. Por lo general, esto indica que previamente intentamos cargar una clase desde la ruta de clases, pero falló por algún motivo; ahora lo intentamos de nuevo, pero ni siquiera intentaremos cargarlo, porque no lo cargamos antes. La falla anterior podría ser ClassNotFoundException o ExceptionInInitializerError (lo que indica una falla en el bloque de inicialización estática) o cualquier cantidad de otros problemas. El punto es que NoClassDefFoundError no es necesariamente un problema de classpath.

Me gustaría ver la fuente de javax.mail.Authenticator, y ver lo que está haciendo en su inicializador estático. (Mire la inicialización de la variable estática y el bloque estático, si hay alguno). Si no obtiene un ClassNotFoundException antes del NoClassDefFoundError, tiene casi la garantía de que se trata de un problema de inicialización estático.

He visto errores similares con bastante frecuencia cuando el archivo hosts define incorrectamente la dirección del host local, y el bloque de inicialización estático se basa en InetAddress.getLocalHost(). 127.0.0.1 debe apuntar a 'localhost' (y probablemente también localhost.localdomain). NO debe indicar el nombre de host real de la máquina (aunque, por alguna razón, a muchos instaladores anteriores de RedHat Linux les gustaba configurarlo incorrectamente).

8

Una vez corrí en esta situación y tenía las dependencias en classpath. La solución era incluir javax.mail y javax.bibliotecas de activación en la carpeta lib del contenedor (por ejemplo, tomcat). Con Maven, los configurará en con el alcance y debería funcionar. Habrá bibliotecas de correo electrónico compartidas en classpath para todos los proyectos.

fuente útil: http://haveacafe.wordpress.com/2008/09/26/113/

18

Agregar siguientes a su dependencia 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

con el correo javax 1.5.2 enfrento el error [ejecución Servlet lanzó una excepción] con causa raíz java.lang.NoClassDefFoundError: com/sol/mail/util/MailLogger –

+1

Para navegar por las versiones más recientes ver [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

Cuando tuve este problema, que había incluido el mail-api.jar en mi archivo Maven POM. Esa es la especificación API solo. La solución es reemplazar esto:

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

con la implementación de referencia de esa API:

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

sé que tiene sol en el nombre del paquete, pero esa es la versión más reciente. Esto lo aprendí de https://stackoverflow.com/a/28935760/1128668

Cuestiones relacionadas