Подтвердить что ты не робот

Java.lang.NoClassDefFoundError: javax/mail/Authenticator, что не так?

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

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

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

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

Отчет об исключении типа

сообщение

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

исключение 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)

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

4b9b3361

Ответ 1

Вам нужно добавить две банки в каталог WEB-INF/lib или ваш webapp (или каталог lib на сервере):

  • mail.jar - содержит фактическую имплантировку smtp
  • activation.jar - требуется mail.jar

Ответ 2

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

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

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

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

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

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

Ответ 3

Добавьте в свою зависимость от 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

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

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

Ответ 5

Когда у меня была эта проблема, я включил mail-api.jar в мой файл maf maven. Это только спецификация API. Исправление состоит в том, чтобы заменить это:

<!-- DO NOT USE - it 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>

Я знаю, что в названии пакета есть солнце, но это последняя версия. Я узнал об этом из fooobar.com/questions/73690/...

Ответ 6

Даже я столкнулся с подобной ошибкой. Попробуйте ниже 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. Если это не сработает, поместите вручную файлы jar в каталог .m2\repository\javax\<folder>\<version>\.