簡體   English   中英

在Tomcat 5上控制WEB-INF / lib中jar的類路徑排序?

[英]Control the classpath ordering of jars in WEB-INF/lib on Tomcat 5?

我有一個在Tomcat 5.0中運行的遺留Web應用程序。

這個Web應用程序在WEB-INF / lib中有兩個jar,比如說Foo-2.0.jarBar-2.0.jar Bar-2.0.jar實際上包含了一個Foo-1.0.jar Bar也是一個死的項目,意味着沒有升級,沒有來源,但對應用程序仍然很重要。

該應用程序的最新版本需要Foo-2.0.jar來處理其他一些內容。 在類路徑中同時具有Foo-1.0.jarFoo-2.0.jar會產生沖突,特別是ClassDefNotFound類型的錯誤,其中稍后在2.0中添加的類無法在1.0中找到,等等。

在Eclipse中,簡單的解決方案是右鍵單擊您的Project ,單擊Properties > Java Built Path > Order and Export並將Foo-2.0.jar移到Bar-2.0.jar之上,以便首先解析它。

如何在Tomcat的WEB-INF / lib中為jar實現這種類型的路徑排序?

Tomcat 5的 webapps 類加載優先級大致如下:首先是bootstrap / system( JRE/lib ,然后是Tomcat的內部類),然后是webapp庫(首先是WEB-INF/classes ,然后是WEB-INF/lib ),然后是常見的庫(首先是Tomcat/common ,然后是Tomcat/lib ),最后是webapp-shared庫( Tomcat/shared )。

因此,要 Bar-2.0.jar 之前加載Foo-2.0.jar ,最好的辦法是將Bar-2.0.jarWEB-INF/libTomcat/commonTomcat/shared

JAR未按名稱的字母順序加載。 至少,沒有規范說明這一點。 重命名它們以更改按字母順序排列的文件名順序是沒有意義的。

Bar-2.0.jar中剝離Foo-1.0.jar 事實上,等待開發(需要捏造開發環境)和部署都很麻煩。

將Foo-1.0.jar放到$ CATALINE_HOME / common / endorsed(或者在Foo-2.0.jar之后將加載它的任何其他位置)。

您沒有,因為Tomcat中沒有此功能。 如果同時在類路徑中同時需要Foo-1.0.jar和Foo-2.0.jar,則需要進行一些主要的類路徑重組。

如果Bar-2.0可以與Foo-2.0一起使用,那么最好的辦法就是在沒有Foo-1.0.jar的情況下自己重建Bar-2.0。

可以在jar的mainfest中設置Class-Path。 http://java.sun.com/developer/Books/javaprogramming/JAR/basics/manifest.html我不能保證它會解決問題,但值得一試。

要在Bar-2.0.jar之前使用Foo-2.0.jar,請使用Foo-2.0.jar的內容更新Bar-2.0.jar(覆蓋已包含的.class)並從war中刪除Foo-2.0.jar。

-cp A.jar:B.jar有效,A.jar的內容就像是B.jar上的一層。 所以你用A.jar的覆蓋B.jar的內容會得到同樣的效果。

這有點hacky但可能會奏效。 將Foo-2.0.jar的名稱改為按字母順序排在Bar-2.0.jar之前,比如說AFoo-2.0.jar。

暫無
暫無

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

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