我正在使用GlassFish作为应用程序服务器的Java EE应用程序。我开发了一个可插入的插件用于发送电子邮件(我将其命名为EmailProvider)。为此,我使用后期绑定在运行时加载EmailProvider jar。我有一个自定义URLClassLoader,它加载EmailProvider类文件。电子邮件提供商具有用于发送电子邮件的JavaMail API。这是代码片段。如果我在我的Java EE应用程序中包含EmailProvider类但是抛出异常,则此代码可以正常工作 运输运输= session.getTransport(“smtp”); 说“javax.mail.NoSuchProviderException:smtp”我是在运行时使用customClassLoader加载类的。我知道这是类加载问题。我也通过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);
} }
答案 0 :(得分:1)
首先,there's nothing named "JEE"。正确的名称是“Java EE”。
问题是JavaMail无法在javax.mail.jar文件中找到配置文件。它使用线程的上下文类加载器的getResource()方法来查找它。假设您已经设置了自定义类加载器,以便您的应用程序类加载器是父类加载器,您可以将线程的上下文类加载器设置为自定义类加载器。