java.lang.NoClassDefFoundError:javax/mail/Authenticator,怎么回事?

blu*_*lla 31 java jakarta-mail

发送到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 = "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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的controller.java的一部分

/* Send to Email will run properly soon */
            sendToEmail email = new sendToEmail(strEmailAddress);
Run Code Online (Sandbox Code Playgroud)

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

键入例外报告

信息

description服务器遇到内部错误(),导致无法完成此请求.

异常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应用程序吗?

Dav*_*itz 47

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


Jar*_*red 26

虽然这可能是由于类路径中缺少jar文件,但可能不是.

在这种情况下,重要的是要保持两到三个不同的例外:

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

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

我会查看源代码javax.mail.Authenticator,并查看它在静态初始化程序中的作用.(查看静态变量初始化和静态块,如果有的话.)如果你没有得到ClassNotFoundExceptionNoClassDefFoundError,你几乎可以保证它是一个静态初始化问题.

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


Kor*_*clü 20

在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>
Run Code Online (Sandbox Code Playgroud)


zer*_*021 8

我曾经在这种情况下运行,并且我在classpath中有依赖项.解决方案是在容器(例如,tomcat)lib文件夹中包含javax.mail和javax.activation库.使用maven,您可以将它们设置为提供范围,它应该可以工作.您将在类路径中为所有项目共享电子邮件库.

有用的来源:http://haveacafe.wordpress.com/2008/09/26/113/