2009-10-27 13 views
30

Email.java कोjava.lang.NoClassDefFoundError: javax/मेल/प्रमाणक, क्या गलत?

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

मेरी controller.java

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

की भेजें भाग जब मैं अपने वेब अनुप्रयोग मैं यह त्रुटि संदेश कह मिल गया चलाएँ:

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)

अब मैं क्या करूँगा? क्या कोई इस वेब एप्लिकेशन को सफल बनाने में मेरी मदद कर सकता है?

उत्तर

45

आप वेब-INF/lib निर्देशिका या अपने webapp (या सर्वर lib निर्देशिका) में दो जार जोड़ने की जरूरत:

  • mail.jar - वास्तविक smtp implmentation
  • activation.jar शामिल हैं - की जरूरत mail.jar
25

हालांकि यह संभव है कि यह आपके क्लासपाथ से लापता एक जार फ़ाइल के कारण हो, हो सकता है।

यह दो या तीन अलग अलग अपवाद इस मामले में हमारे सिर में स्ट्रेट रखना महत्वपूर्ण है:

  1. java.lang.ClassNotFoundException यह अपवाद इंगित करता है कि वर्ग classpath पर नहीं मिला था। यह इंगित करता है कि हम कक्षा परिभाषा को लोड करने की कोशिश कर रहे थे, और वर्ग कक्षा में मौजूद नहीं था।

  2. java.lang.NoClassDefFoundError यह अपवाद इंगित करता है कि JVM एक वर्ग की परिभाषा के लिए अपने आंतरिक वर्ग परिभाषा डेटा संरचना में देखा और यह भी नहीं मिला। यह कहने से अलग है कि इसे कक्षापथ से लोड नहीं किया जा सका। आम तौर पर यह इंगित करता है कि हमने पहले क्लासपाथ से कक्षा को लोड करने का प्रयास किया था, लेकिन यह किसी कारण से विफल रहा - अब हम फिर कोशिश कर रहे हैं, लेकिन हम इसे लोड करने की कोशिश भी नहीं कर रहे हैं, क्योंकि हम इसे पहले लोड करने में विफल रहे। पहले विफलता एक ClassNotFoundException या एक ExceptionInInitializerError या अन्य समस्याओं के किसी भी संख्या (स्थिर प्रारंभ ब्लॉक में एक विफलता का संकेत है) हो सकता है। बिंदु यह है कि NoClassDefFoundError आवश्यक रूप से क्लासपाथ समस्या नहीं है।

मैं javax.mail.Authenticator के लिए स्रोत पर विचार करेंगे, और देखो यह क्या यह स्थिर प्रारंभकर्ता है में कर रही है। (स्थिर वैरिएबल प्रारंभिकता और स्थैतिक ब्लॉक को देखें, यदि कोई है।) यदि आपको NoClassDefFoundError से पहले ClassNotFoundException नहीं मिल रहा है, तो आप लगभग गारंटी देते हैं कि यह एक स्थिर प्रारंभिक समस्या है।

मेजबान फ़ाइल गलत तरीके से स्थानीयहोस्ट पते को परिभाषित करते समय मैंने समान त्रुटियों को देखा है, और स्थैतिक प्रारंभिक ब्लॉक InetAddress.getLocalHost() पर निर्भर करता है। 127.0.0.1 को 'लोकलहोस्ट' (और शायद localhost.localdomain) को इंगित करना चाहिए। यह मशीन के वास्तविक होस्ट नाम को इंगित नहीं करना चाहिए (हालांकि किसी कारण से, कई पुराने रेडहाट लिनक्स इंस्टॉलर इसे गलत तरीके से सेट करना पसंद करते हैं)।

8

मैं एक बार इस स्थिति में चलाने के लिए और मैं classpath में निर्भरता था। समाधान javax.mail और javax शामिल था।कंटेनर (जैसे। टोमकैट) lib फ़ोल्डर में सक्रियण पुस्तकालय। मेवेन के साथ आप उन्हें पर स्कोप प्रदान करेंगे और इसे काम करना चाहिए। आप सभी परियोजनाओं के लिए कक्षापथ में ईमेल libs साझा किया होगा।

उपयोगी स्रोत: http://haveacafe.wordpress.com/2008/09/26/113/

18

जोड़ें अपने 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> 
+1

से javax मेल 1.5.2 के साथ इस सीखा मैं त्रुटि मूल कारण java.lang.NoClassDefFoundError साथ [सर्वलेट निष्पादन एक अपवाद फेंक दिया] का सामना: com/सूर्य/मेल/util/MailLogger –

+1

ब्राउज़ करने के लिए नवीनतम संस्करण को देखने के [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

जब मैं इस समस्या थी के लिए निम्न, मैं अपने Maven पोम फ़ाइल में mail-api.jar शामिल किया था। यह एपीआई विनिर्देश केवल है। ठीक इस बदलने के लिए है:

<!-- DO NOT USE - it's just the API, not an implementation --> 
<groupId>javax.mail</groupId> 
<artifactId>javax.mail-api</artifactId> 
कि एपीआई के संदर्भ कार्यान्वयन के साथ

:

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

मैं जानता हूँ कि यह पैकेज नाम पर सूरज है, लेकिन है कि नवीनतम संस्करण है। मैं https://stackoverflow.com/a/28935760/1128668

संबंधित मुद्दे