2011-09-09 69 views
4
  • 問題1: 我們知道,當一個類加載器將要加載一個類時,將請求委託給它的父類加載器。但是,在Tomcat中,它不會:您可以加載您的類來覆蓋放在公共lib目錄中的相同名稱類。這意味着Tomcat WebappClassloader不遵循授權政策。這是否違反慣例?Tomcat的類加載器違反了委託的政策

  • 問題2: 我寫了一個類,把它放在常用的lib目錄下,顯然這個類是在web應用程序之間共享的。例如,每個Web應用程序都可以讀取/寫入該類的靜態字段。此外,JDK中的類由Bootstrap類加載器加載,然後它們的靜態字段由任何Web應用程序共享,是否危險?

回答

6

此行爲是故意的,它允許您在每個WAR中獨立重寫Tomcat本身提供的庫。例如,您可以爲每個部署到容器的應用程序使用不同版本的Log4J,而不會引入任何問題或打破其他應用程序。從Tomcat documentation

像許多服務器應用程序,Tomcat的安裝各種各樣的類加載器[...]以允許容器的不同部分,並且容器上運行的Web應用程序,以訪問到可用類別和資源的不同存儲庫。該機制用於提供Servlet規範2.4版中定義的功能 - 特別是第9.4節和第9.6節。

它確實違反了正常的委託算法,但這也是其他應用服務器的工作方式(例如JBoss)。

Ad。問題2:是的,這是危險的,你必須記住關於同步並且不能控制誰修改這個變量。我會完全避免static字段。

例如EhCache允許你分享CacheManager。這是通過net.sf.ehcache.CacheManager#singletonstatic volatile字段實施的。現在您遇到了各種問題:如果您將ehcache.jar放入Tomcat的/lib中,它將按預期工作。但是,如果每個Web應用程序都有自己的JAR文件副本,則共享將無法工作,因爲每個Web應用程序都有自己的CacheManager類副本。當只有一個應用程序擁有自己的ehcache.jar時,它會變得更糟 - 所有應用程序將共享相同的CachedManager實例,但將ehcache.jar打包在一起。這種錯誤很難追查到......

+0

感謝您的回答!是的,每個應用服務器都應該「違反」授權算法。 –

+0

看到我的更新,回答你的第二個問題。 –

相關問題