郵件開發:Tomcat中JavaMail支援與衝突

恆奇恆毅發表於2016-01-07
l用普通方式在web應用程式中增加郵件傳送功能,在eclipse沒有匯入mail.jar可以編譯,但部署執行有問題的原因
lTomcat支援的JNDI資源方式,步驟:
Ø配置JNDI資源。
Ømail.jar拷貝到<tomcat_home>/lib目錄下。
Ø[tomcat在建立Session的時候需要用到mail.jar中的類,如果你放在WEB-INF/lib下,tomcat的類載入器就找不到,同理,如果你的資料來源也讓Tomcat建立以JNDI的方式給你,那你就需要把資料來源相關的jar放到<tomcat_home>/lib]
ØJava程式中使用JNDIAPI獲得mailsession物件。

使用JNDI的方式配置javamail,如果common目錄和web-inf/lib目錄中都放置了mail.jar包,java虛擬機器中將有兩份類位元組碼,這兩份類位元組碼相當於兩個不同的類。[出現ClassCastExceptionjavax.mail.Session不能轉換成javax.mail.Session]eclipse中開發這個專案時,要注意開發時環境與執行時環境,對於mail.jar包中,包含在j2ee庫中了,必須手工部署到tomcatcommon目錄中。[類載入器問題,使用JNDI的方式配置javamailtomcat載入類的時候使用自己的classloader,在他自己的目錄中去找javax.mail.Session],你的庫裡面沒有mail.jar,類載入器採取向上委託的方式委託給tomcat類載入器去載入。

使用如下兩條語句列印出類載入器的名稱:

System.out.println(initCtx.lookup("java:comp/env/mail/Session").getClass().getClassLoader().getClass().getName());

System.out.println(Session.class.getClassLoader().getClass().getName());


<Context>

  <Resourcename="mail/Dog"auth="Container"

  type="javax.mail.Session"

  mail.smtp.host="smtp.sina.com"

  mail.smtp.auth="true"

   mail.transport.protocol="smtp"

  />

</Context>


try {

 

  Context initCtx =new InitialContext();

  Context envCtx =(Context) initCtx.lookup("java:comp/env");

  Session session =(Session) envCtx.lookup("mail/Dog");

  Message message =new MimeMessage(session);

  message.setFrom(newInternetAddress("itcast_test@sina.com"));

  InternetAddressto[] = new InternetAddress[1];

  to[0] = newInternetAddress("itcast_test@sina.com");

  message.setRecipients(Message.RecipientType.TO,to);

  message.setSubject("ha");

  message.setText("test");

  //Transport.send(message);

  Transporttransport = session.getTransport();

  transport.connect("smtp.sina.com","itcast_test", "123456");

  transport.sendMessage(message,to);

  transport.close();

  response.getWriter().print("ok!");

  } catch(Exception e) {

  // TODOAuto-generated catch block

  e.printStackTrace(response.getWriter());

  }

如果在你的lib下放了mail.jar,上面的Session就是這個jar中的Session類的位元組碼,而envCtx.lookup(“mail/Dog”);Tomcat建立

Session的位元組碼卻是Tomcatlib中的,於是記憶體中就有兩份位元組碼,出現同一個類的型別轉換錯誤。


其實就,類載入器的問題。只要完全熟悉類載入器既不會束手無策了。

相關文章