【发布时间】:2013-05-09 17:06:59
【问题描述】:
我正在开发一个以 GlassFish 作为应用服务器的 Java EE 应用程序。我开发了一个用于发送电子邮件的可插拔插件(我将其命名为 EmailProvider)。为此,我使用后期绑定在运行时加载 EmailProvider jar。我有一个自定义 URLClassLoader 加载 EmailProvider 类文件。电子邮件提供商具有用于发送电子邮件的 JavaMail API。这是代码sn-p。如果我在我的 Java EE 应用程序中包含 EmailProvider 类但在 传输传输 = session.getTransport("smtp"); 如果我在运行时使用 customClassLoader 加载类,说“javax.mail.NoSuchProviderException: smtp”。我知道这是类加载问题。我还通过 customloader 加载 javax.mail.jar。我认为问题是从两个不同的类加载器加载相同的类(javax.mail.jar)。如果我省略 javax.mail.jar,那么我会得到 javax.mail 类的 ClassNotFoundException
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("name@some.com");
message.setFrom(addressFrom);
InternetAddress[] addressTo = new InternetAddress[1];
addressTo[0] = new InternetAddress("somenamea@gmail.com");
//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);
} }
【问题讨论】: