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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1630002/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 18:00:39  来源:igfitidea点击:

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

javajavamail

提问by bluestella

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 = "[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);
        }
    }
}

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.

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)

类型异常报告

信息

说明 服务器遇到内部错误 (),阻止它完成此请求。

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

根本原因 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 应用程序成功吗?

回答by David Rabinowitz

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

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

回答by Jared

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.ClassNotFoundExceptionThis 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.

  2. java.lang.NoClassDefFoundErrorThis 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 ClassNotFoundExceptionor an ExceptionInInitializerError(indicating a failure in the static initialization block) or any number of other problems. The point is, a NoClassDefFoundErroris not necessarily a classpath problem.

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

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

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 ClassNotFoundExceptionprior to the NoClassDefFoundError, you're almost guaranteed that it's a static initialization problem.

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

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).

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

回答by zeratul021

I once ran into this situation and I had the dependencies in classpath. The solution was to include javax.mail and javax.activation libraries in the container's (eg. tomcat) lib folder. Using maven -set them to providedscope and it should work. You will have shared email libs in classpath for all projects.

我曾经遇到过这种情况,并且我在类路径中有依赖项。解决方案是在容器(例如 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/

回答by Koray Güclü

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>

回答by GlenPeterson

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

当我遇到这个问题时,我已经mail-api.jar在我的 maven pom 文件中包含了。那只是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://stackoverflow.com/a/28935760/1128668

我知道它的包名中有 sun,但这是最新版本。我从https://stackoverflow.com/a/28935760/1128668了解到这一点

回答by Manan Shah

Even I was facing a similar error. Try below 2 steps (the first of which has been recommended here already) - 1. Add the dependencies to your pom.xml

甚至我也面临着类似的错误。尝试以下 2 个步骤(此处已推荐第一个步骤)- 1. 将依赖项添加到您的pom.xml

         <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. If that doesn't work, manually place the jarfiles in your .m2\repository\javax\<folder>\<version>\directory.
  1. 如果这不起作用,请手动将jar文件放在您的.m2\repository\javax\<folder>\<version>\目录中。