javax.mail.NoSuchProviderException: smtp происходит, когда класс загружается из пользовательского загрузчика классов - PullRequest
0 голосов
/ 24 февраля 2012

Я работаю над приложением Java EE с GlassFish в качестве сервера приложений. Я разработал подключаемый модуль для отправки электронных писем (я назвал его EmailProvider). Для этого я использую позднюю привязку, чтобы загрузить JAR EmailProvider во время выполнения. У меня есть пользовательский URLClassLoader, который загружает файл класса EmailProvider. Поставщик электронной почты имеет JavaMail API для отправки электронной почты. Вот фрагмент кода. Этот код отлично работает, если я включаю класс EmailProvider в свое приложение Java EE, но выдает исключение при Transport transport = session.getTransport ("smtp"); говоря "javax.mail.NoSuchProviderException: smtp" я загружаю класс во время выполнения, используя customClassLoader. Я знаю, что это проблема загрузки классов. Я также загружаю javax.mail.jar через customloader. Я думаю, что проблема в том, что одни и те же классы (javax.mail.jar) загружаются из двух разных загрузчиков классов. Если я опускаю javax.mail.jar, я получаю ClassNotFoundException для классов javax.mail

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 Ответ

1 голос
/ 24 февраля 2012

Во-первых, нет ничего с именем "JEE" . Правильное имя "Java EE".

Проблема в том, что JavaMail не может найти файл конфигурации в файле javax.mail.jar. Он использует метод getResource () загрузчика класса контекста потока, чтобы найти его. Предполагая, что вы настроили свой пользовательский загрузчик классов так, чтобы ваш загрузчик классов приложений был родительским загрузчиком классов, вы можете установить загрузчик класса контекста потока в свой пользовательский загрузчик классов.

...