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

时间:2015-06-30 12:38:30

标签: java tomcat jar classloader tomcat8

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

这个JAR是我创建的Java SPI的提供者。当我在WEB-INF/lib下拥有它时,一切都很完美。但是,如果我尝试将此JAR放在Tomcat的lib文件夹下(或在shared/lib中配置后,在catalina.properties下),我会收到错误。第二种选择对我来说更好,因为我需要完全解耦我的应用程序和提供者。

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

不同之处在于使用的类加载器。 Tomcat对它的类加载器有非常具体的规则,其中一些是反直觉的。这里的问题是,在一个类加载器中加载的类与在另一个类加载器中加载的类不兼容。甚至对象都会失败。

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

解决方案是将所有罐子移动到同一个类加载器中。 lib-folder中的所有内容,或者战争中的所有内容。

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