Tomcat 8类加载 - [WEB-INF/lib]和[tomcat/lib]中JAR的区别

4
它在这里here说,公共类加载器对所有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应用程序的依赖项。
2个回答

5

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


4
区别在于使用的类加载器。Tomcat有其特定的类加载器规则,其中一些规则是反直觉的。你的问题在于,一个类在一个类加载器中加载,与另一个类在另一个类加载器中加载不兼容。即使是Object到Object的转换也会失败。
包含你接口的jar由web应用程序类加载器加载,因为它位于war文件中。实现由公共类加载器加载。公共类加载器不包含你的接口,所以它会抛出ClassNotFoundException。
解决方案是将所有jar放入同一个类加载器中。可以将所有文件放在lib文件夹中,或放在你的war文件中。
在Tomcat中实现插件架构是一个相当困难的任务。使用像OSGi这样的东西可能会有所帮助。但对于小问题来说,这可能有点过头了。有趣,但过头了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接