2010-11-16 64 views

回答

18

我做我自己的研究(通過規範和一些博客會)和下面是我已經想通

EAR

該規範不定義或強制的類加載器應該如何工作在EAR內。然而,它定義了

  1. 應該有每個線程的上下文類加載器的類運行時加載
  2. 有可能是解決階級分層類加載機制(應用服務器廠商可以自由地實現他們選擇哪個方式)
  3. 頂級類加載器(WAR/EAR)可以委託給低級類加載器(如Bootstrap,擴展等)。這是符合J2SE類加載委託模型(PARENT_FIRST在WAS)

WAR

servlet規範定義,並授權一個PARENT_LAST的支持(即WAR/WEB-INF /類和WAR/web-inf/lib優先於應用服務器附帶的庫)類加載模型。但是這僅僅適用於WAR模塊。在這種情況下,Servlet規範偏離了PARENT_FIRST的標準J2SE委派模型。

參考

規格:Servlet 2.3的,科:9.7.2 Web應用程序類加載

規格:Java EE 5中,條:EE.6.2.4.7上下文類加載器

應用服務器細節

不過,有趣的是,它似乎大多數主要的應用程序服務器支持一些關閉代理隔離的機制從如有必要(因爲衝突或其他方式)的應用服務器E應用:的WebSphere - 「父母最後」,GlassFish的 - <class-loader delegate="false">,JBoss的 - java2ParentDelegation=false,Geronimo的 - <java2-delgation-model>false</java2-delegation-model>

+1

不錯的一個。在Glassfish中,它是'sun-web.xml'中的',以關閉委派。另見http://docs.sun.com/app/docs/doc/819-3659/beadf?l=en&a=view(圖片)和http://docs.sun.com/app/docs/doc/821 「-1752/beade?l = en&a = view – BalusC 2010-11-18 01:53:58

0

良好的信息。我正在研究同樣的問題,並得出類似的結論。仍然存在的一個問題是,是否建議使用「最後一個選項」?我想會是因爲你的應用程序更具可移植性;你不依賴Appserver庫。您實現應用程序隔離。 我沒有看到有人推薦這種或那種方式。你有沒有遇到過這樣的最佳實踐建議?

+0

」我認爲這會是因爲你的應用程序更具可移植性;你不依賴Appserver庫,你實現了應用程序隔離。「----它可能會也可能不會工作因爲規範沒有規定標準。對於例如http://stackoverflow.com/questions/4097567/jboss-and-different-versions-of-hibernate – 2010-11-19 04:16:58

+0

這裏是另外1個嘗試使用JSF 2的場景。0與WAS 7和使用PARENT_LAST EAR和WAR。仍然試圖使用它與之捆綁在一起的myfaces impl。當然,他可以通過更新EL impl來解決問題,但重要的是,即使您切換委派政策,也無法保證所有工作都能正常工作:http://stackoverflow.com/questions/3214373/websphere-7-jsf- 2-0-和類加載器 – 2010-11-19 04:43:45