2009-10-27 8 views
30

Send to Email.javajava.lang.NoClassDefFoundError: javax/mail/Authenticator, có chuyện gì vậy?

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); 
     } 
    } 
} 

phần controller.java tôi

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

Khi tôi chạy ứng dụng web của tôi, tôi đã thông báo lỗi này nói:

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)

Tôi sẽ làm gì bây giờ? Ai đó có thể giúp tôi để có được ứng dụng web này thành công?

Trả lời

45

Bạn cần phải thêm hai lọ vào thư mục WEB-INF/lib hay webapp của bạn (hoặc thư mục lib của máy chủ):

25

Mặc dù có thể do tệp jar bị thiếu trong đường dẫn lớp của bạn nên có thể không.

Điều quan trọng là để giữ cho hai hoặc ba trường hợp ngoại lệ khác nhau eo biển trong đầu của chúng tôi trong trường hợp này:

  1. java.lang.ClassNotFoundException ngoại lệ này chỉ ra rằng lớp không tìm thấy trên classpath. Điều này chỉ ra rằng chúng tôi đang cố tải định nghĩa lớp và lớp không tồn tại trên classpath.

  2. java.lang.NoClassDefFoundError ngoại lệ này chỉ ra rằng JVM nhìn vào cấu trúc dữ liệu định nghĩa lớp nội bộ của mình cho định nghĩa của một lớp và không tìm thấy nó. Điều này khác với nói rằng nó không thể được tải từ classpath. Thông thường, điều này cho thấy rằng trước đây chúng tôi đã cố gắng tải một lớp từ classpath, nhưng nó không thành công vì lý do nào đó - bây giờ chúng tôi đang thử lại, nhưng chúng tôi thậm chí sẽ không thử tải nó, bởi vì chúng tôi không tải nó trước đó. Lỗi trước đó có thể là ClassNotFoundException hoặc ExceptionInInitializerError (cho biết lỗi trong khối khởi tạo tĩnh) hoặc bất kỳ số lượng sự cố nào khác. Vấn đề là, NoClassDefFoundError không nhất thiết phải là vấn đề về classpath.

Tôi sẽ xem nguồn cho javax.mail.Authenticator và xem nó đang làm gì trong trình khởi chạy tĩnh của nó. (Nhìn vào khởi tạo biến tĩnh và khối tĩnh, nếu có.) Nếu bạn không nhận được một ClassNotFoundException trước NoClassDefFoundError, bạn gần như chắc chắn rằng đó là vấn đề khởi tạo tĩnh.

Tôi đã gặp lỗi tương tự khá thường xuyên khi tệp máy chủ định nghĩa không chính xác địa chỉ máy chủ cục bộ và khối khởi tạo tĩnh dựa trên InetAddress.getLocalHost(). 127.0.0.1 nên trỏ đến 'localhost' (và có thể cả localhost.localdomain). Nó KHÔNG nên trỏ đến tên máy chủ thực sự của máy (mặc dù vì một số lý do, nhiều trình cài đặt RedHat Linux cũ thích đặt nó không chính xác).

8

Tôi đã từng chạy trong trường hợp này và tôi đã có các phụ thuộc trong classpath. Giải pháp là bao gồm javax.mail và javax.thư viện kích hoạt trong thư mục lib của container (ví dụ: tomcat). Với maven bạn sẽ đặt chúng thành với phạm vi và nó sẽ hoạt động. Bạn sẽ có email libs chia sẻ trong classpath cho tất cả các dự án.

nguồn hữu ích: http://haveacafe.wordpress.com/2008/09/26/113/

18

Add sau để phụ thuộc maven bạn

<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

với thư javax 1.5.2 Tôi gặp lỗi [Servlet thực thi đã ném ngoại lệ] với nguyên nhân gốc java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger –

+1

Để duyệt qua các phiên bản mới nhất, hãy xem [javax.mail] (http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22javax.mail%22%20AND%20a%3A%22mail%22) & [javax.activation] (http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22javax.activation%22%20AND%20a%3A%22activation%22) –

2

Khi tôi có vấn đề này, tôi đã bao gồm mail-api.jar trong tập tin maven pom của tôi. Đó là đặc điểm kỹ thuật API chỉ. Việc sửa chữa là thay thế này:

<!-- DO NOT USE - it's just the API, not an implementation --> 
<groupId>javax.mail</groupId> 
<artifactId>javax.mail-api</artifactId> 

với việc thực hiện tham chiếu của api rằng:

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

Tôi biết nó có ánh nắng mặt trời trong tên gói, nhưng đó là phiên bản mới nhất. Tôi đã học được điều này từ https://stackoverflow.com/a/28935760/1128668