[英]Tomcat 8 classloading - difference between JAR in [WEB-INF/lib] and [tomcat/lib]
它在這里說,所有Web應用程序都可以看到通用的類加載器。 那么在我的war
應用程序的WEB-INF/lib
文件夾中擁有一個JAR文件和在Tomcat的lib
文件夾中擁有相同的JAR文件之間的區別是什么?
這個JAR是我創建的Java SPI的提供者。 當我在WEB-INF/lib
下使用它時,一切都很完美。 但是如果我嘗試將這個JAR放在Tomcat的lib
文件夾下(或者在catalina.properties
配置它之后在shared/lib
下),我會收到錯誤。 第二個選項對我來說更好,因為我需要完全解耦我的應用程序和提供程序。
我得到的錯誤是代表我的服務(JAR實現)的接口的ClassNotFoundException
。 此接口位於第三個項目中,該項目是我的war
應用程序的依賴項。
tomcat/lib
目錄應該用於整個Web服務器的共享庫,而WEB-INF/lib
僅用於一個Web應用程序。
不同之處在於使用的類加載器。 Tomcat對它的類加載器有非常具體的規則,其中一些是反直覺的。 這里的問題是,在一個類加載器中加載的類與在另一個類加載器中加載的類不兼容。 甚至對象也將失敗。
包含您的界面的jar由webapp類加載器加載,因為它位於war文件中。 該實現由公共類加載器加載。 這不包含您的接口,因此它會拋出ClassNotFoundException。
解決方案是將所有jar都移動到同一個類加載器中。 lib-folder中的所有內容,或者戰爭中的所有內容。
使用Tomcat實現插件架構是一項相當困難的任務。 使用類似OSGi的東西可能會有所幫助。 但對於小問題,它可能有點過分。 有趣,但有點矯枉過正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.