2012-02-24 3 views
0

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

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("[email protected]"); 
     message.setFrom(addressFrom); 
     InternetAddress[] addressTo = new InternetAddress[1]; 
     addressTo[0] = new InternetAddress("[email protected]"); 
     //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

Во-первых, there's nothing named "JEE". Правильное имя - «Java EE».

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

+0

Большое спасибо. Работает ContextClassLoader. Это то, что я добавил. Thread.currentThread() setContextClassLoader (myLoader). – androider