我正在使用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);
} }
非常感謝。設置ContextClassLoader工作。這是我補充說的。 Thread.currentThread()setContextClassLoader(myLoader)。 – androider 2012-02-24 19:21:10