2011-03-29 77 views
27

任何人都可以解釋從Tomcat中的lib目錄加載jar文件的順序嗎? 它是否按字母順序排列?隨機?或者其他一些命令?從lib目錄加載jar文件的順序

+1

類似:http://stackoverflow.com/q/8364619/435605 – 2015-02-24 09:43:15

回答

27

全部描述在Tomcat's ClassLoading HOW-TO。這不一定是按字母順序。如果你觀察到這種行爲,那麼如果你打算讓你的web應用程序跨服務器移動,它應該被依賴於絕對不是。例如,Tomcat 6「巧合」地命令它,但Tomcat 8不會。

概述的,加載順序如下:

  1. 引導/系統(JRE/lib,然後server.loader
  2. web應用庫(WEB-INF/classes,然後WEB-INF/lib
  3. 公共庫(common.loader,然後Tomcat/lib
  4. webapp-shared libraries(shared.loader

如果你想保證JAR X之後 JARŸ加載,那麼你需要把JAR X中出現上述列表中後的地方之一。

但也有例外然而,這是在tomcat docs

最後提到,Web應用程序的類加載器總是首先委託爲被Tomcat(的Servlet,JSP,EL,WebSocket的實施規範JavaEE的API類)。 Tomcat中的所有其他類加載器都遵循通常的代理模式。

這意味着如果webapp包含任何JavaEE類(javax.*),那麼它將被tomcat忽略。

對於每個加載器,只要JVM按照需要導入/執行並且尚未加載的順序,這些類就會按順序加載。

+1

沒有說明加載從該文件*在一個目錄下的*順序? – 2011-03-29 15:18:27

+1

@Joachim:它只是在JVM需要它的時候加載的。 OP更多地要求搜索訂單。 – BalusC 2011-03-29 15:20:22

+0

謝謝BalusC。我將檢查需要的工件的順序,並希望能夠得出合理的解決方案 – Damien 2011-03-29 15:31:18

28

實際上,它按字母順序排列! (在一個特定的目錄,如「lib」目錄下,原來的海報提及。)

更確切地說,如果你看一下源爲Tomcat 6,在FileDirContext類,文件的陣列上list()調用Arrays.sort()方法找到的罐子名稱。

我也手動測試過。我用一個叫做HelloWorld.getGreeting()的JSP創建了一場戰爭,並將兩個幾乎完全相同的包含HelloWorld的版本的jar放到WEB-INF/lib目錄中。一個說「你好,世界」,另一個說「再見,殘酷的世界」。

如果我將「Hello,world」版本的a.jar和「goodbye」版本的b.jar命名爲,並重新啓動Tomcat,則會顯示「Hello」文本。如果我用另一個方式命名罐子並重新啓動Tomcat,我會得到「Goodbye」文本。

據我已經能夠確定,這種行爲是沒有記錄,沒有指定,不應該依靠。但現在是按字母順序排列的。

+3

+1用於指出發佈文檔中的「gotcha」 – bakoyaro 2011-10-26 16:27:38

+6

我可以證實這是針對Tomcat 5 + 6的,但目前有問題,因爲Tomcat 8.0.9的行爲不像那樣! – Daniel 2014-07-13 05:47:06

1

我完全同意BalusC提供的答案。僅指向添加是指從各個類加載器加載JAR時,它會檢查字母順序。

我有一種情況在我的web應用程序中加載「XSSFWorkbook」以從Excel表格讀取數據,並且有兩個JARS「poi-ooxml-3.9.jar」和「org.eclipse.birt.runtime_4.3.1.v20130918- 1142.jar「,具有相同的類名和包結構。我只是將它的後面的字母順序重新排列,並且它爲我提供了一個技巧。只是想分享一樣。

好運

15

訂購WEb-INF/lib文件夾中已加載的罐子。

對於tomcat 5-7,訂單是按字母順序的。它使用排序。

對於tomcat 8是隨機決定的底層文件系統。

https://issues.apache.org/bugzilla/show_bug.cgi?id=57129

+0

你正在接聽或問一個新問題嗎? – 2014-10-30 00:24:22

+0

猜一猜:)。我在回答。 – user2193008 2014-11-04 15:51:42

+0

請花些時間重新格式化您的答案,以使其看起來像一個答案。看看[如何寫出一個好答案](http://stackoverflow.com/help/how-to-answer),看看如何改進你的答案。 – 2014-11-04 16:00:03

相關問題