javax.mail.NoSuchProviderException:从自定义类加载器加载类时发生smtp

时间:2012-02-24 00:33:16

标签: classloader javamail

我正在使用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);
    } }

1 个答案:

答案 0 :(得分:1)

首先,there's nothing named "JEE"。正确的名称是“Java EE”。

问题是JavaMail无法在javax.mail.jar文件中找到配置文件。它使用线程的上下文类加载器的getResource()方法来查找它。假设您已经设置了自定义类加载器,以便您的应用程序类加载器是父类加载器,您可以将线程的上下文类加载器设置为自定义类加载器。