java.lang.NoClassDefFoundError: javax/mail/Authenticator, what is wrong?

2022-09-01 07:07:37

发送到电子邮件.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);
        }
    }
}

我的控制器的一部分.java

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

当我运行我的Web应用程序时,我收到此错误消息说:

类型异常报告

消息

说明 服务器遇到内部错误 (),导致它无法满足此请求。

异常 javax.servlet.ServletException: Servlet 执行引发异常

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)

我现在该怎么办?有人可以帮助我使此Web应用程序成功吗?


答案 1

您需要将两个 jar 添加到 WEB-INF/lib 目录或 webapp(或服务器的 lib 目录)中:


答案 2

虽然这可能是由于类路径中缺少 jar 文件造成的,但事实并非如此。

在这种情况下,重要的是要在我们的脑海中保留两到三个不同的例外:

  1. java.lang.ClassNotFoundException 此异常指示在类路径上找不到该类。这表明我们尝试加载类定义,并且类路径上不存在该类。

  2. java.lang.NoClassDefFoundError 此异常表示 JVM 在其内部类定义数据结构中查找了类的定义,但未找到它。这与说它不能从类路径加载是不同的。通常,这表示我们以前尝试从类路径加载类,但由于某种原因它失败了 - 现在我们再次尝试,但我们甚至不打算尝试加载它,因为我们之前加载它失败了。较早的故障可能是 a 或 a(表示静态初始化块中的故障)或任何其他问题。关键是,a 不一定是类路径问题。ClassNotFoundExceptionExceptionInInitializerErrorNoClassDefFoundError

我会查看 的源代码,看看它在静态初始值设定项中做了什么。(查看静态变量初始化和静态块(如果有)。如果你没有得到 一个之前,你几乎可以保证这是一个静态初始化问题。javax.mail.AuthenticatorClassNotFoundExceptionNoClassDefFoundError

当hosts文件错误地定义了localhost地址时,我经常看到类似的错误,而静态初始化块依赖于.127.0.0.1 应该指向“localhost”(可能还有 localhost.localdomain)。它不应该指向计算机的实际主机名(尽管由于某种原因,许多较旧的RedHat Linux安装程序喜欢错误地设置它)。InetAddress.getLocalHost()


推荐