2014-01-14 48 views
0

我正尝试使用JavaMail API发送电子邮件。这里是我的servlet代码: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目录或Tomcat的lib目录中。

当然,如果你使用的是完整的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> 

我知道它在包名太阳,但是这是最新版本。

相关问题