簡體   English   中英

在部署期間自動在WEB-INF / lib下加載Java EE類

[英]Java EE loading classes under WEB-INF/lib automatically during deployment

我正在解決多個應用程序需要共享彼此加載的類的問題。

所以我開始創建一個單獨的應用程序並將所有公共庫放入其中。 我還做了必要的應用程序服務器特定的啟用/配置更改。 我試圖找到可以在部署戰爭后立即加載WEB-INF / lib / * .jar下的所有類。

假設我不希望使用ie Foo.class單獨加載類。 我真的試圖看看是否只能通過啟用配置來編寫JAVA代碼來手動加載WEB-INF / lib下的所有類。

如果您嘗試在多個Web應用程序中共享庫,則需要將這些庫放在JBOSS的共享庫文件夾中。 JBOSS將在啟動時加載。

看到這個:

在JBoss AS 5中放置共享庫的位置?

webapp訪問另一個webapp類加載器是不可能的。 app classloader,可以訪問3個類加載器:

  1. 它自己的類加載器
  2. 容器類加載器
  3. Bootstrap類加載器(加載Java SDK類)。

如果我們經歷你提到的不同點:

  • 我正在解決多個應用程序需要共享彼此加載的類的問題:將類放在服務器級別的公共類加載器中,並將它們從WARs WEB-INF / lib中刪除,以避免WAR類隱藏服務器類。 例如,在Tomcat的情況下,將jar放在$TOMCAT_HOME/lib

  • 為什么這不是一個好主意:這通常不是一個好主意,我們應該只在服務器級別放置所需的最小類,以避免由於靜態變量(鏈接到類)導致的問題無意中在應用程序中共享,增加了類強制轉換異常等的可能性

  • 所以我開始創建一個單獨的應用程序並將所有公共庫放入其中:這不會按預期工作,一個WAR應用程序的WEB-INF / lib中的類是隔離的,在另一個WAR的類中不可見。 因此,創建單獨的應用程序不是實現此目的的方法,而是在服務器級別的類加載器上安裝類。

  • 我試圖在部署war之后盡快加載WEB-INF / lib / .jar 下的所有類 :*這在servlet容器中沒有預見到,請參閱此答案以了解使用Java代碼執行此操作的方法。 此功能不可用的原因是JVM在其他類需要時懶惰地加載類,並且沒有為了節省內存而進行前期加載。

發生類加載的那一刻最好留給JVM的內部工作,其中有許多優化以最有效的方式加載類並避免perm gen問題。

如果這不能回答問題,您可以告訴我們您需要預先加載類的用例,我們可能會為您要實現的內容提供一些替代方案 - 例如增加初始請求的超時等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM