2014-01-14 6 views
0

Я пытаюсь отправить электронное письмо с использованием JavaMail API. Вот мой код на сервлета:java.lang.NoClassDefFoundError: Не удалось инициализировать класс javax.mail.internet.InternetAddress

package com.lsp.web; 

import com.lsp.service.Mailer; 
import javax.ejb.EJB; 
import javax.mail.MessagingException; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

@WebServlet(name = "contact", urlPatterns = {"/contact"}) 
public class ContactServlet extends SpringInjectedServlet { 
@EJB 
private Mailer emailBean; 

@Override 
public void init() throws ServletException { 

} 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    doPost(req, resp); 
} 

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String customerEmail = req.getParameter("email"); 
    String subject = req.getParameter("subject"); 
    String body = req.getParameter("message"); 

    String error = null; 
    String succMess = null; 

    try { 
     javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail); 
     ia.validate(); 
     emailBean.send(customerEmail, subject, body); 
     req.setAttribute("succMessage", succMess); 
     req.getRequestDispatcher("sent.jsp").forward(req, resp); 

    } catch (javax.mail.internet.AddressException ae) { 
     error = "您指出的邮箱地址不存在"; 
     req.setAttribute("errorMessage", error); 
     req.getRequestDispatcher("contact.jsp").forward(req, resp); 
    } 
    catch (MessagingException mex) { 
     error = "发送失败"; 
     req.setAttribute("errorMessage", error); 
     req.getRequestDispatcher("contact.jsp").forward(req, resp); 
    } 
} 
} 

На линии, где я проверяю адрес пользователя, где:

javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail); 
ia.validate(); 

я получил исключение. java.lang.NoClassDefFoundError: Не удалось инициализировать учащемуся javax.mail.internet.InternetAddress

В pom.xml, я добавил следующие строки:

<!--JavaMail API--> 
    <dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>javax.mail-api</artifactId> 
     <version>1.5.1</version> 
    </dependency> 

    <!--EJB--> 
    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>ejb-api</artifactId> 
     <version>3.0</version> 
    </dependency> 

Я использую Tomcat. Может ли кто-нибудь сказать мне, почему это происходит и как я могу решить проблему.

спасибо.

+0

Кажется, что вам не хватает соответствующих библиотек Java EE. –

+0

Как вы компилируете и запускаете этот код? Вы должны убедиться, что у вас есть все необходимые библиотеки в пути к классам, а не только при компиляции, но и при запуске кода. – Jesper

+0

Как вы создаете и запускаете приложение? Вы используете Maven? Если это так, возможно, это поможет, если вы покажете нам свой файл pom.xml. – andersschuller

ответ

0

Вы получаете java.lang.NoClassDefFoundError, что означает, что JVM не может инициализировать класс, а не то, что он не может найти класс, который был бы ClassNotFoundException. NoClassDefFoundError может быть вызван ClassNotFoundException, но это не обязательно.

Чтобы найти причину, остановите сервер, удалите журнал и начните заново. Затем воспроизведите ошибку и попытайтесь найти первое исключение и его причину в файле журнала. Если вам повезет, это причина для NoClassDefFoundError.

Вы также можете указать в своем вопросе, какой сервер вы используете. Для решения этой проблемы может возникнуть проблема.

+0

Что значит «какой сервер вы используете»? – user3014926

+0

Какой контейнер JEE, Tomcat, JBoss, ... –

+0

Я использую Tomcat. – user3014926

0

Добавление зависимости во время сборки не делает ничего доступным для Tomcat во время выполнения. Вам нужно добавить файл javax.mail.jar в каталог WEB-INF/lib вашего приложения или в каталог lib от Tomcat.

Конечно, вы не имели бы эту проблему, если вы использовали полный сервер приложений Java EE вместо Tomcat ... :-)

0

Пожалуйста, см: https://stackoverflow.com/a/28935760/1128668 Вы включили mail-api.jar в вашем проекте. Это спецификация 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> 

Я знаю, что есть солнце в имени пакета, но это последняя версия.

Смежные вопросы