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

时间:2023-01-19 21:45:18

Send to Email.java

发送到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);
        }
    }
}

portion of my controller.java

我的controller.java的一部分

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

When I run my web application I got this error message saying:

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

Type Exception report

键入例外报告

message

description The server encountered an internal error () that prevented it from fulfilling this request.

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

exception javax.servlet.ServletException: Servlet execution threw an exception

异常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)

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)

What will I do now? Can somebody help me to get this web application successful?

我现在该怎么办?有人可以帮助我成功获得这个Web应用程序吗?

5 个解决方案

#1


46  

You need to add two jars into the WEB-INF/lib directory or your webapp (or lib directory of the server):

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

  • mail.jar - contains the actual smtp implmentation
  • mail.jar - 包含实际的smtp implmentation

  • activation.jar - needed by mail.jar
  • activation.jar - mail.jar需要

#2


25  

While it's possible that this is due to a jar file missing from your classpath, it may not be.

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

It is important to keep two or three different exceptions strait in our head in this case:

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

  1. java.lang.ClassNotFoundException This exception indicates that the class was not found on the classpath. This indicates that we were trying to load the class definition, and the class did not exist on the classpath.

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

  2. java.lang.NoClassDefFoundError This exception indicates that the JVM looked in its internal class definition data structure for the definition of a class and did not find it. This is different than saying that it could not be loaded from the classpath. Usually this indicates that we previously attempted to load a class from the classpath, but it failed for some reason - now we're trying again, but we're not even going to try to load it, because we failed loading it earlier. The earlier failure could be a ClassNotFoundException or an ExceptionInInitializerError (indicating a failure in the static initialization block) or any number of other problems. The point is, a NoClassDefFoundError is not necessarily a classpath problem.

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

I would look at the source for javax.mail.Authenticator, and see what it is doing in it's static initializer. (Look at static variable initialization and the static block, if there is one.) If you aren't getting a ClassNotFoundException prior to the NoClassDefFoundError, you're almost guaranteed that it's a static initialization problem.

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

I have seen similar errors quite frequently when the hosts file incorrectly defines the localhost address, and the static initialization block relies on InetAddress.getLocalHost(). 127.0.0.1 should point to 'localhost' (and probably also localhost.localdomain). It should NOT point to the actual host name of the machine (although for some reason, many older RedHat Linux installers liked to set it incorrectly).

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

#3


20  

Add following to your maven dependency

在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>

#4


8  

I once run in this situation and I had the dependencies in classpath. Solution was to include javax.mail and javax.activation libraries in container's (eg. tomcat) lib folder. With maven you will set them to provided scope and it should work. You will have shared email libs in classpath for all projects.

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

Useful source: http://haveacafe.wordpress.com/2008/09/26/113/

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

#5


4  

When I had this problem, I had included the mail-api.jar in my maven pom file. That's the API specification only. The fix is to replace this:

当我遇到这个问题时,我在我的maven pom文件中包含了mail-api.jar。这只是API规范。修复是替换这个:

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

with the reference implementation of that api:

与api的参考实现:

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

I know it has sun in the package name, but that's the latest version. I learned this from https://*.com/a/28935760/1128668

我知道包装名称中有太阳,但这是最新版本。我从https://*.com/a/28935760/1128668了解到了这一点

#1


46  

You need to add two jars into the WEB-INF/lib directory or your webapp (or lib directory of the server):

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

  • mail.jar - contains the actual smtp implmentation
  • mail.jar - 包含实际的smtp implmentation

  • activation.jar - needed by mail.jar
  • activation.jar - mail.jar需要

#2


25  

While it's possible that this is due to a jar file missing from your classpath, it may not be.

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

It is important to keep two or three different exceptions strait in our head in this case:

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

  1. java.lang.ClassNotFoundException This exception indicates that the class was not found on the classpath. This indicates that we were trying to load the class definition, and the class did not exist on the classpath.

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

  2. java.lang.NoClassDefFoundError This exception indicates that the JVM looked in its internal class definition data structure for the definition of a class and did not find it. This is different than saying that it could not be loaded from the classpath. Usually this indicates that we previously attempted to load a class from the classpath, but it failed for some reason - now we're trying again, but we're not even going to try to load it, because we failed loading it earlier. The earlier failure could be a ClassNotFoundException or an ExceptionInInitializerError (indicating a failure in the static initialization block) or any number of other problems. The point is, a NoClassDefFoundError is not necessarily a classpath problem.

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

I would look at the source for javax.mail.Authenticator, and see what it is doing in it's static initializer. (Look at static variable initialization and the static block, if there is one.) If you aren't getting a ClassNotFoundException prior to the NoClassDefFoundError, you're almost guaranteed that it's a static initialization problem.

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

I have seen similar errors quite frequently when the hosts file incorrectly defines the localhost address, and the static initialization block relies on InetAddress.getLocalHost(). 127.0.0.1 should point to 'localhost' (and probably also localhost.localdomain). It should NOT point to the actual host name of the machine (although for some reason, many older RedHat Linux installers liked to set it incorrectly).

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

#3


20  

Add following to your maven dependency

在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>

#4


8  

I once run in this situation and I had the dependencies in classpath. Solution was to include javax.mail and javax.activation libraries in container's (eg. tomcat) lib folder. With maven you will set them to provided scope and it should work. You will have shared email libs in classpath for all projects.

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

Useful source: http://haveacafe.wordpress.com/2008/09/26/113/

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

#5


4  

When I had this problem, I had included the mail-api.jar in my maven pom file. That's the API specification only. The fix is to replace this:

当我遇到这个问题时,我在我的maven pom文件中包含了mail-api.jar。这只是API规范。修复是替换这个:

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

with the reference implementation of that api:

与api的参考实现:

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

I know it has sun in the package name, but that's the latest version. I learned this from https://*.com/a/28935760/1128668

我知道包装名称中有太阳,但这是最新版本。我从https://*.com/a/28935760/1128668了解到了这一点