【问题标题】:javax.mail.NoSuchProviderException: smtp occurs when class is loaded from a custom class loaderjavax.mail.NoSuchProviderException:从自定义类加载器加载类时发生 smtp
【发布时间】: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);
    } }

【问题讨论】:

    标签: classloader jakarta-mail


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。设置 ContextClassLoader 工作。这是我添加的。 Thread.currentThread().setContextClassLoader(myLoader);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多