2012-02-24 67 views
0

我正在使用GlassFish作爲應用程序服務器來處理Java EE應用程序。我開發了一個用於發送電子郵件的可插入插件(我已將其命名爲EmailProvider)。爲此,我使用後期綁定來在運行時加載EmailProvider jar。我有一個加載EmailProvider類文件的自定義URLClassLoader。電子郵件提供商使用JavaMail API發送電子郵件。這是代碼片段。如果我在Java EE應用程序中包含EmailProvider類,但在 處引發異常,此代碼完美起作用Transport transport = session.getTransport(「smtp」); 說「javax.mail.NoSuchProviderException:smtp」我f我在運行時使用customClassLoader加載類。我知道這是類加載問題。我也通過自定義加載器加載javax.mail.jar。我認爲問題是從兩個不同的類加載器加載相同的類(javax.mail.jar)。如果我省略javax.mail.jar然後我得到的ClassNotFoundException爲javax.mail類javax.mail.NoSuchProviderException:從定製類加載器加載類時發生smtp

Class EmailProvider{ 
try { 
     Properties props = new Properties(); 

     props.put("mail.smtp.host", "IP ADDRESS"); 
     props.put("mail.smtp.starttls.enable", "false"); 
     props.put("mail.transport.protocol", "smtp"); 
     props.put("mail.smtp.class", "com.sun.mail.smtp.SMTPTransport"); 

     Session session = Session.getInstance(props, null); 

     session.setDebug(false); 
     Provider provider = session.getProvider("smtp"); 
     javax.mail.Message message = new MimeMessage(session); 

     InternetAddress addressFrom = new InternetAddress("[email protected]"); 
     message.setFrom(addressFrom); 
     InternetAddress[] addressTo = new InternetAddress[1]; 
     addressTo[0] = new InternetAddress("[email protected]"); 
     //msg.setRecipients(javax.mail.Message.RecipientType.TO, addressTo); 
     message.setSubject("Hello"); 
     message.setContent("testing..", "text/plain"); 
     session.setProvider(provider);    
     Transport transport = session.getTransport("smtp"); 
     transport.connect("IP ADDRESS", "domain\\username", "password");    
     transport.sendMessage(message, addressTo); 


    } catch (Exception ex) { 
     Logger.getLogger(SendEmail.class.getName()).log(Level.SEVERE, null, ex); 
    } } 

回答

1

首先,there's nothing named "JEE"。正確的名稱是「Java EE」。

問題是JavaMail無法在javax.mail.jar文件中找到配置文件。它使用線程的上下文類加載器的getResource()方法來查找它。假設你已經設置了自定義的類加載器,以便你的應用程序類加載器是父類加載器,那麼可以將線程的上下文類加載器設置爲你的自定義類加載器。

+0

非常感謝。設置ContextClassLoader工作。這是我補充說的。 Thread.currentThread()setContextClassLoader(myLoader)。 – androider 2012-02-24 19:21:10