java.lang.NoClassDefFoundError: javax / mail / Authenticator, что не так? - PullRequest
30 голосов
/ 27 октября 2009

Отправить на 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);
        }
    }
}

часть моего контроллера. Java

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

Когда я запускаю свое веб-приложение, я получаю это сообщение об ошибке:

Тип Exception report

сообщение

описание Сервер обнаружил внутренняя ошибка (), которая помешала от выполнения этого запроса.

исключение javax.servlet.ServletException: Сервлетное исполнение выкинуло исключение

первопричина java.lang.NoClassDefFoundError: javax / почта / Authenticator controller.RegisterTenantController.doPost (RegisterTenantController.java:108) javax.servlet.http.HttpServlet.service (HttpServlet.java:709) javax.servlet.http.HttpServlet.service (HttpServlet.java:802)

Что мне теперь делать? Может ли кто-нибудь помочь мне добиться успеха этого веб-приложения?

Ответы [ 5 ]

46 голосов
/ 27 октября 2009

Вам необходимо добавить два jar-файла в каталог WEB-INF / lib или ваше веб-приложение (или каталог lib сервера):

  • mail.jar - содержит фактическую имплантацию smtp
  • activ.jar - требуется mail.jar
26 голосов
/ 27 октября 2009

Хотя это возможно из-за отсутствия файла jar в вашем пути к классам, это не так.

В этом случае важно сохранить два или три разных исключения в нашей голове:

  1. java.lang.ClassNotFoundException Это исключение означает, что класс не найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, а класс не существовал в пути к классам.

  2. java.lang.NoClassDefFoundError Это исключение указывает на то, что JVM просмотрела в своей внутренней структуре данных определения класса определение класса и не нашла его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это означает, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине это не удалось - теперь мы пытаемся снова, но даже не собираемся пытаться загрузить его, потому что мы не смогли загрузить его ранее. Более ранний сбой мог быть ClassNotFoundException или ExceptionInInitializerError (указывая на сбой в блоке статической инициализации) или любым другим количеством проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой пути к классам.

Я бы посмотрел на источник для javax.mail.Authenticator и увидел, что он делает в своем статическом инициализаторе. (Посмотрите на инициализацию статической переменной и статический блок, если таковой имеется.) Если вы не получаете ClassNotFoundException до NoClassDefFoundError, вы почти гарантировано, что это проблема статической инициализации.

Я часто сталкивался с подобными ошибками, когда файл hosts неправильно определяет адрес локального хоста, а блок статической инициализации использует InetAddress.getLocalHost(). 127.0.0.1 должен указывать на 'localhost' (и, вероятно, также localhost.localdomain). Он НЕ должен указывать на фактическое имя хоста машины (хотя по какой-то причине многие старые установщики RedHat Linux предпочитали устанавливать его неправильно).

20 голосов
/ 14 августа 2012

Добавьте подписчиков к вашей 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>
8 голосов
/ 14 сентября 2011

Я однажды работал в этой ситуации, и у меня были зависимости в classpath. Решением было включить библиотеки javax.mail и javax.activation в папку lib контейнера (например, tomcat). С maven вы установите их на при условии scope, и это должно работать. У вас будут общие почтовые библиотеки в classpath для всех проектов.

Полезный источник: http://haveacafe.wordpress.com/2008/09/26/113/

4 голосов
/ 09 января 2016

Когда у меня возникла эта проблема, я включил 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>

с эталонной реализацией этого API:

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

Я знаю, что в названии пакета есть солнце, но это последняя версия. Я узнал это от https://stackoverflow.com/a/28935760/1128668

...