2015-06-30 86 views
4

它說here通用類加載器對所有Web應用程序都是可見的。那麼在我的war應用程序的WEB-INF/lib文件夾中有一個JAR文件,並且在Tomcat的lib文件夾中具有相同的JAR文件之間有什麼區別?Tomcat 8類加載 - [WEB-INF/lib]和[tomcat/lib]中的JAR之間的區別

這個JAR是我創建的Java SPI的提供者。當我擁有WEB-INF/lib時,一切正常。但是,如果我嘗試將此JAR放在Tomcat的lib文件夾下(或在配置爲catalina.properties後在shared/lib下),則會出現錯誤。第二種選擇對我來說更好,因爲我需要將應用程序和提供程序徹底解耦。

我得到的錯誤是代表我的服務(JAR實現的)的接口的ClassNotFoundException。此接口位於第三個項目中,這是我的war應用程序的依賴項。

回答

5

tomcat/lib目錄應該用於整個Web服務器的共享庫和WEB-INF/lib僅適用於一個Web應用程序。

2

區別在於正在使用的類加載器。 Tomcat對於類加載器有非常明確的規則,其中一些規則是直觀的。你的問題在於,在一個類加載器中加載的類與在另一個類中加載的類不兼容。即使對象到對象也會失敗。

包含接口的jar由webapp classloader加載,因爲它位於war文件中。該實現由通用類加載器加載。這不包含你的接口,所以它拋出一個ClassNotFoundException。

解決方案是將所有jar放入同一個類加載器。無論是lib文件夾中的所有內容,還是戰爭中的所有內容。

使用Tomcat實現插件架構是一項相當困難的任務。使用類似OSGi的東西可能會有所幫助。但對於小問題,這可能是矯枉過正。有趣,但矯枉過正。