为什么 JAR 放在 WAR 库中而不是共享 tomcat 库中时可以正常工作?
Why JAR works correcly when placed inside WAR libraries but not inside shared tomcat libraries?
我在 Tomcat 上部署了一个应用程序 (WAR),其中包含多个 jar 文件。由于某些原因,我需要在其中一个 jar 文件中扩展一个 class 并覆盖他的一个方法。新方法将根据每个客户的需要而有所不同。
我所做的是创建一个依赖主 jar 的小 jar 文件,添加扩展原始 jar 的 class,然后编译它。
现在我想在 Tomcat 上部署它,以便 Spring 加载新的 class。如果我将新 jar 放入已部署的 WAR 的 WEB-INF/lib 中,则效果很好,但如果我将其放入 Tomcat 的 shared/lib(或只是 lib)中,则效果不佳].对于我正在扩展的错误,错误是 ClassNotFoundException(基本上无法找到来自主 jar 的每个 class)。我已经检查了 catalina.properties,它在两个位置都正确加载了 .jar。
我的问题是:为什么这个 JAR 只有在我将它放在 WAR 库中时才有效,而如果我将它放在 Tomcat 的共享库中则不起作用?
Tomcat 版本为 7.0.86
一个小方案,可以更好地了解哪些有效,哪些无效:
- tomcat folder
- lib
- jar-that-extends-main-jar.jar (ClassNotFoundException for the one I'm extending)
- shared
- lib
- jar-that-extends-main-jar.jar (ClassNotFoundException for the one I'm extending)
- webapps
- my-application
- WEB/INF
- lib
- jar-that-extends-main-jar.jar (this works correctly and I can use my custom class)
Tomcat 在树状层次结构中使用不同的类加载器(您可以在此处查看图片和一些解释:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html)。
基本上,每个 webapp 都有一个类加载器,一个用于共享库,一个用于系统,一个用于 bootstrap,其中 webapp classloader 位于树的底部,然后它上升了。但是,类加载器只能访问其父 class 加载器,反之则不行,因此在查找 class 时,class 加载器将查看其自身的 class es,然后向其父 classloaders 询问特定的 class.
这就是为什么您可以从您的网络应用程序访问共享 classloader 中的 classes,但反过来却不行。
我在 Tomcat 上部署了一个应用程序 (WAR),其中包含多个 jar 文件。由于某些原因,我需要在其中一个 jar 文件中扩展一个 class 并覆盖他的一个方法。新方法将根据每个客户的需要而有所不同。
我所做的是创建一个依赖主 jar 的小 jar 文件,添加扩展原始 jar 的 class,然后编译它。
现在我想在 Tomcat 上部署它,以便 Spring 加载新的 class。如果我将新 jar 放入已部署的 WAR 的 WEB-INF/lib 中,则效果很好,但如果我将其放入 Tomcat 的 shared/lib(或只是 lib)中,则效果不佳].对于我正在扩展的错误,错误是 ClassNotFoundException(基本上无法找到来自主 jar 的每个 class)。我已经检查了 catalina.properties,它在两个位置都正确加载了 .jar。
我的问题是:为什么这个 JAR 只有在我将它放在 WAR 库中时才有效,而如果我将它放在 Tomcat 的共享库中则不起作用? Tomcat 版本为 7.0.86
一个小方案,可以更好地了解哪些有效,哪些无效:
- tomcat folder
- lib
- jar-that-extends-main-jar.jar (ClassNotFoundException for the one I'm extending)
- shared
- lib
- jar-that-extends-main-jar.jar (ClassNotFoundException for the one I'm extending)
- webapps
- my-application
- WEB/INF
- lib
- jar-that-extends-main-jar.jar (this works correctly and I can use my custom class)
Tomcat 在树状层次结构中使用不同的类加载器(您可以在此处查看图片和一些解释:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html)。
基本上,每个 webapp 都有一个类加载器,一个用于共享库,一个用于系统,一个用于 bootstrap,其中 webapp classloader 位于树的底部,然后它上升了。但是,类加载器只能访问其父 class 加载器,反之则不行,因此在查找 class 时,class 加载器将查看其自身的 class es,然后向其父 classloaders 询问特定的 class.
这就是为什么您可以从您的网络应用程序访问共享 classloader 中的 classes,但反过来却不行。