郵件開發:Tomcat中JavaMail支援與衝突
使用JNDI的方式配置javamail,如果common目錄和web-inf/lib目錄中都放置了mail.jar包,java虛擬機器中將有兩份類位元組碼,這兩份類位元組碼相當於兩個不同的類。[出現ClassCastException,javax.mail.Session不能轉換成javax.mail.Session]在eclipse中開發這個專案時,要注意開發時環境與執行時環境,對於mail.jar包中,包含在j2ee庫中了,必須手工部署到tomcat的common目錄中。[類載入器問題,使用JNDI的方式配置javamail,tomcat載入類的時候使用自己的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的位元組碼卻是Tomcat的lib中的,於是記憶體中就有兩份位元組碼,出現同一個類的型別轉換錯誤。
其實就,類載入器的問題。只要完全熟悉類載入器既不會束手無策了。
相關文章
- 郵件開發:Javamail、JAF簡介JavaAI
- Java郵件(JavaMail)JavaAI
- Jboss3.0-Tomcat4.03下運用JavaMail發電子郵件. (轉)S3TomcatJavaAI
- javamail郵件傳送例子JavaAI
- 使用JavaMail傳送郵件JavaAI
- javamail傳送郵件(轉)JavaAI
- 【知識積累】JavaMail實現發郵件功能JavaAI
- iOS 開發中遇到的手勢衝突iOS
- 郵件開發:接收解析郵件
- JSP與JavaMail(4)---傳送HTML格式的郵件 (轉)JSJavaAIHTML
- 使用JavaMail實現收取和回覆郵件JavaAI
- JavaMail(JAVA郵件服務) API詳解JavaAIAPI
- JavaMail:java使用QQ郵箱傳送郵件簡單版。JavaAI
- JavaMail傳送郵件時常見錯誤JavaAI
- Springboot+Javamail實現郵件傳送Spring BootJavaAI
- JSP與JavaMail(6)---編寫靈活的郵件傳送程式 (轉)JSJavaAI
- 機器學習與傳統軟體開發的衝突與融合 - alepiad機器學習
- 郵件開發:複雜郵件的一個示例
- 郵件開發:DNS、JDNIDNS
- JavaMail 保證郵件傳送成功的方法總結JavaAI
- JSP與JavaMail(3)---試著寫第一個郵件傳送程式 (轉)JSJavaAI
- 解決Oracle XDB與Tomcat等的8080埠的衝突OracleTomcat
- 郵件開發:傳送程式
- 處理併發衝突
- tomcat中,目標版本 1.3 與預設的源版本 1.5 衝突錯誤的解決Tomcat
- 測試驅動開發(TDD)跟敏捷開發有衝突敏捷
- 如何避免javascript中的衝突JavaScript
- 求救:學習用JAVAMAIL編的郵件系統出問題了!JavaAI
- 群發郵件
- shell發郵件
- oracle 發郵件Oracle
- 在Foxmail中收發Yahoo!郵件AI
- svn檔案衝突,樹衝突詳解
- BE Remote Agent與Oracle EM埠衝突REMOracle
- ivew表格中render函式與tooltip:true衝突問題函式
- 郵件開發:SMTP協議詳解協議
- PHP中的trait方法衝突PHPAI
- Eclipse中Egit衝突解決EclipseGit