Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat 8类加载-JAR在[WEB-INF/lib]和[Tomcat/lib]中的差异_Java_Tomcat_Jar_Classloader_Tomcat8 - Fatal编程技术网

Java Tomcat 8类加载-JAR在[WEB-INF/lib]和[Tomcat/lib]中的差异

Java Tomcat 8类加载-JAR在[WEB-INF/lib]和[Tomcat/lib]中的差异,java,tomcat,jar,classloader,tomcat8,Java,Tomcat,Jar,Classloader,Tomcat8,它说公共类加载器对所有web应用程序都是可见的。那么,在我的war应用程序的WEB-INF/lib文件夹中有一个JAR文件与在Tomcat的lib文件夹中有相同的JAR文件有什么区别呢 这个JAR是我创建的JavaSPI的提供者。当我把它放在WEB-INF/lib下时,一切都很正常。但是,如果我试图将这个JAR放在Tomcat的lib文件夹下(或者在catalina.properties中配置后放在shared/lib下),我就会出错。第二个选项对我来说更好,因为我需要完全解耦我的应用程序和提供

它说公共类加载器对所有web应用程序都是可见的。那么,在我的
war
应用程序的
WEB-INF/lib
文件夹中有一个JAR文件与在Tomcat的
lib
文件夹中有相同的JAR文件有什么区别呢

这个JAR是我创建的JavaSPI的提供者。当我把它放在
WEB-INF/lib
下时,一切都很正常。但是,如果我试图将这个JAR放在Tomcat的
lib
文件夹下(或者在
catalina.properties
中配置后放在
shared/lib
下),我就会出错。第二个选项对我来说更好,因为我需要完全解耦我的应用程序和提供者


我得到的错误是表示我的服务(JAR实现)的接口的
ClassNotFoundException
。此接口位于第三个项目中,它是我的
war
应用程序的依赖项。

整个web服务器的共享库应使用
tomcat/lib
目录,而
web-INF/lib
仅用于一个web应用程序。

区别在于所使用的类加载器。Tomcat对其类加载器有非常具体的规则,其中一些规则是违反直觉的。这里的问题是,一个类装入器中装入的类与另一个类装入器中装入的类不兼容。即使是对象对对象也会失败

包含接口的jar由webapp类加载器加载,因为它位于war文件中。实现由公共类加载器加载。它不包含您的接口,因此会引发ClassNotFoundException

解决方案是将所有jar移动到同一个类加载器中。要么是lib文件夹中的所有内容,要么是war中的所有内容

用Tomcat实现插件体系结构是一项相当困难的任务。使用类似OSGi的东西可能会有所帮助。但对于小问题,这可能是矫枉过正。很有趣,但是太过分了