Я работаю над приложением 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);
} }
Большое спасибо. Работает ContextClassLoader. Это то, что я добавил. Thread.currentThread() setContextClassLoader (myLoader). – androider