2015-08-10 7 views
0

Мне нужно отправить электронное письмо с приложением, но у меня возникла следующая ошибка.Отправить письмо с приложением в приложении RCP Java с помощью javax

!ENTRY org.eclipse.rap.ui 4 0 2015-08-10 11:45:25.505 
!MESSAGE Unhandled event loop exception 
!STACK 0 

java.lang.LinkageError: loader constraint violation: when resolving method "javax.mail.internet.MimeMessage.setDataHandler(Ljavax/activation/DataHandler;)V " the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) of the current class, com/fotgroup/tecas/ui/dialog/EmailSender, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class, javax/mail/internet/MimeMessage, have different Class objects for the type setDataHandler used in the signature

at com.fotgroup.tecas.ui.dialog.EmailSender.sendMail(EmailSender.java:67) 

Я не могу получить путь к изображению, так как это RCP, а также это происходит, когда я пытаюсь использовать DataHandler.

+0

У вас есть несколько версий JAR-файлы JavaMail на вашем пути к классам. Оптимизировать. – EJP

ответ

1

Трудно сказать без манифестации связанных пакетов, но это похоже на ошибку установки рамки.

я могу видеть, что есть JBoss модули ClassLoader и Equinox ClassLoader в смеси здесь, и я предполагаю, что вы начинаете в рамки Equinox OSGi внутри модули каркаса JBoss. Остальная часть этого ответа предполагает, что это то, что вы делаете.

Для выполнения этой работы вам необходимо делегировать загрузку «пакетов, предоставленных JBoss», таких как Java EE API, в родительскую структуру модулей JBoss, иначе вы столкнетесь с непоследовательными проблемами пространства классов (например, LinkageError вы видите), когда вы вызываете серверные компоненты JBoss.

Что вам нужно сделать, это добавить к системным пакетам системы (пакеты, предоставленные системным пакетом в системе Equinox). Вы делаете это, указав свойство org.osgi.framework.system.packages.extra при запуске.

Значение свойства должно включать в себя все пакеты, которые вы хотите добавить и своих версий и и используете ограничения (если вы хотите, чтобы все работало правильно).

К примеру, в этом случае вам потребуется, по крайней мере (и, возможно, более):

javax.mail;version=1.4;uses:="javax.activation, 
    javax.mail.event,javax.mail.search", 
javax.mail.event;version=1.4;uses:="javax.mail" 
javax.mail.internet;version=1.4;uses:="javax.activation, 
    javax.mail,javax.mail.util" 
javax.mail.search;version=1.4;uses:="javax.mail,javax.mail.internet" 
javax.mail.util;version=1.4;uses:="javax.activation,javax.mail.internet" 

Следует заметить, что причина вам нужно сделать, это на самом деле не вина OSGi в. Вы пытаетесь получить доступ к нестандартным (то есть не JRE) пакетам, которые существуют вне рамки изнутри фреймворка. Работа OSGi заключается в обеспечении выполнения зависимостей времени выполнения вашего кода, и это обычно означает «пакеты, которые вы развернули», в этом случае вы получаете доступ к пакетам, которые не поступают из пакетов, поэтому вам нужно указать OSGi, что они собой представляют.

+0

спасибо, за ваше время, я нашел решение своей проблемы, я объясню это на ответ – kevsaba

0

Я нашел решение, чтобы избежать использования DataHandler, я использую следующий код

try { 
MimeMessage m = new MimeMessage(getEmailSession()); 
InternetAddress[] to = new InternetAddress[] { new InternetAddress("[email protected]") }; 
     m.setRecipients(Message.RecipientType.TO, to); 
     if (valideMail) { 
      m.setSender(new InternetAddress(user.getEmail())); 
     } 
     MimeMultipart multiPart = new MimeMultipart("mixed"); 
     MimeBodyPart contentPart = new MimeBodyPart(); 
     contentPart.setText("text", "UTF-8"); 
     multiPart.addBodyPart(contentPart); 
     MimeBodyPart attachmentPart = new MimeBodyPart(); 
     attachmentPart.setContent(emailEntity.getAttachment(), "application/png"); 
     attachmentPart.addHeader("Content-Transfer-Encoding", "base64"); 
     attachmentPart.setDisposition(Part.ATTACHMENT); 
     attachmentPart.setFileName(fileName); 
     multiPart.addBodyPart(attachmentPart); 
     m.setContent(multiPart); 
     // 
     Transport.send(m); 
     // 
     return true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
+0

Вы не решили проблему, вы ее просто избежали :-) –