2009-04-08 45 views
1

的Tomcat版本:5.0.28 JDK:1.5.0.14Tomcat的不能接從清單文件類路徑

問題:

我使用Hibernate和支柱 我們不上這些庫的最新版本和最大版本 因此,兩者都需要不同版本的apache-commons庫。

的解決方案,我心裏有:

使用清單文件,並指定每個

我的web應用程序部署爲 web應用不同版本的Apache的公地\ MYAPP

而且lib是 webapps \ myapp \ WEB-INF \ lib

我修改了hibernate3.jar中的Manifest.mf,如下所示

清單-版本:1.0

歸檔-版本:叢歸檔 創建-通過:1.5.0_15-B04(太陽>微系統公司) 類路徑:hibernatelib/SLF4J-API-1.5 .2.jar

,把SLF4J-API-1.5.2.jar在 的webapps \ MYAPP \ WEB-INF \ lib中\ hibernatelib

現在我期望SLF4J-API 1.5。 2.jar會隨着休眠01自動加載但它不工作... Tomcat是無法找到在指定.MF的jar文件如上

問題:

  1. 我是不是做錯了什麼?或者它是Tomcat?
  2. 有沒有解決這個問題的另一種方法?

我已經嘗試\檢查以下

  1. 在文件
  2. 結束檢查換行符如果我把SLF4J-API-1.5.2.jar在主要的lib文件夾 - 錯誤去離開 - 所以我知道它不是能找到在清單文件中這個特殊的jar文件
  3. 相對試過,絕對路徑

回答

0

清單中使用Class-Path屬性的唯一地方是使用(「java -jar theFile.jar」)將包含清單的jar作爲可執行jar進行調用。

一些servlet容器似乎支持它,但根據to this mailing list post(對不起,找不到任何更快速的authorative)它也沒有在規範中指定。

據我瞭解,Web應用程序使用一個類加載器加載通常他們班。 「正確地」解決依賴性問題需要至少2個不同的類加載器。

甲劈肥胖型解決方案可能是使用jarjar或類似的工具,以與它們各自的依賴關係打包不同的庫在一起。

因此,您將生成一個包含Hibernate及其apache共享庫的另一個jar,以及包含struts和其apache共享庫的另一個jar。 apache-commons庫的每個副本都將被移至不同的包(可能爲hibernate.org.apache.*struts.org.apache.*),以解決不同類別版本的問題。

0

你是否檢查過任何權限是否正確?也可能是一個想法,以確保在最後一個Class-Path線後面有一個換行符,這幫助我今天早些時候!


更新:如果Tomcat不支持的類路徑聲明是這樣,那彈簧想到的唯一的事情涉及到與類加載器瞎搞。就我個人而言,我不會這麼做 - 整個世界都有潛在的痛苦,你可能會有更容易的時間升級。對不起,我想不出更好的答案!

+0

是的,我已經檢查過新行。 我需要檢查什麼權限? – 2009-04-08 20:47:41

+0

只要檢查spec @ http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html我認爲你應該確保在每次輸入後都有一個換行符,它在語法中。 – Brabster 2009-04-08 20:48:21

+0

對不起,可能沒有權限。我已經看到了一些關於Tomcat會忽略在WEB-IN/lib的清單文件中聲明的類路徑的引用 - 沒有任何官方說法,對不起。 – Brabster 2009-04-08 21:09:38

0

您是否嘗試過最新版本的Tomcat以查看問題是否仍然存在? Tomcat的6已經是幾年前的,更何況是5.5或5.0 ...

0

我不相信你能做到這一點。 Tomcat並沒有看JAR清單來決定CLASSPATH問題。它使用自己的類加載器層次結構來查找它需要的內容,並使用它所說的CLASSPATH。

如果你想不同的版本爲您的應用程序的不同部分的JAR,你聽起來像一個人誰真正需要OSGi。這是問題被髮明來解決。

two competing JSRs在那裏,但我不知道太陽模塊提案的實現。

,我知道的是,一個應用服務器將允許你做,這是Spring's DM server。這是Tomcat的一個分支,他們正在加強。