簡體   English   中英

Tomcat 8類加載 - [WEB-INF / lib]和[tomcat / lib]中的JAR之間的區別

[英]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.

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