framework - javamail netbeans
java.lang.NoClassDefFoundError: javax/mail/Authenticator, ¿qué sucede? (5)
Agregue lo siguiente a su dependencia de 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>
Enviar 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);
}
}
}
porción de mi controlador.java
/* Send to Email will run properly soon */
sendToEmail email = new sendToEmail(strEmailAddress);
Cuando ejecuto mi aplicación web recibí este mensaje de error que dice:
Escriba el informe de excepción
mensaje
descripción El servidor encontró un error interno () que le impedía cumplir con esta solicitud.
excepción javax.servlet.ServletException: la ejecución del servlet arrojó una excepción
causa raíz 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?
Cuando tuve este problema, había incluido el mail-api.jar
en mi archivo maven pom. Esa es la especificación API solamente . 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 sun en el nombre del paquete, pero esa es la última versión. Aprendí esto de https://.com/a/28935760/1128668
Debe agregar dos jar en el directorio WEB-INF / lib o en su aplicación web (o en el directorio lib del servidor):
- mail.jar - contiene la implementación smtp real
- activation.jar - necesario por mail.jar
Si bien es posible que esto se deba a que falta un archivo jar en su classpath, puede que no lo sea.
Es importante mantener dos o tres excepciones diferentes en nuestra cabeza en este caso:
java.lang.ClassNotFoundException
Esta excepción indica que la clase no se encontró en classpath. 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.java.lang.NoClassDefFoundError
Esta excepción indica que la JVM buscó en su estructura de datos de definición de clase interna la definición de una clase y no la 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 unaClassNotFoundException
o unExceptionInInitializerError
(que indica una falla en el bloque de inicialización estática) o cualquier cantidad de otros problemas. El punto es que unNoClassDefFoundError
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. (Observe la inicialización de la variable estática y el bloque estático, si es que hay alguno.) Si no obtiene una NoClassDefFoundError
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 de 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).
Una vez corrí en esta situación y tenía las dependencias en classpath. La solución era incluir las bibliotecas javax.mail y javax.activation en la carpeta lib del contenedor (por ejemplo, tomcat). Con maven, los establecerás en el alcance provisto 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/