Java 为什么JAR放在WAR库中而不是放在共享的tomcat库中时工作正常?

Java 为什么JAR放在WAR库中而不是放在共享的tomcat库中时工作正常?,java,tomcat,war,Java,Tomcat,War,我在Tomcat上部署了一个应用程序(WAR),其中包含多个jar文件。出于某些原因,我需要在这些jar文件中扩展一个类,并重写他的一个方法。新方法将根据每个客户的需要而有所不同 我所做的是创建一个依赖于主jar的小jar文件,添加扩展原始jar的类,并对其进行编译 现在我想在Tomcat上部署它,以便Spring加载新类。如果我将新jar放在已部署WAR的WEB-INF/lib中,它就可以正常工作,但如果我将它放在Tomcat的shared/lib(或仅仅是lib)中,它就不起作用。错误是我正

我在Tomcat上部署了一个应用程序(WAR),其中包含多个jar文件。出于某些原因,我需要在这些jar文件中扩展一个类,并重写他的一个方法。新方法将根据每个客户的需要而有所不同

我所做的是创建一个依赖于主jar的小jar文件,添加扩展原始jar的类,并对其进行编译

现在我想在Tomcat上部署它,以便Spring加载新类。如果我将新jar放在已部署WAR的WEB-INF/lib中,它就可以正常工作,但如果我将它放在Tomcat的shared/lib(或仅仅是lib)中,它就不起作用。错误是我正在扩展的类的ClassNotFoundException(基本上,无法找到来自主jar的每个类)。我已经检查了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在某种树层次结构中使用不同的类加载器(您可以在这里看到一张图片和一些解释:)

基本上,每个webapp都有一个类加载器,一个用于共享库,一个用于系统,一个用于引导,其中webapp类加载器位于树的底部,然后它就会上升。然而,类加载器只能访问其父类加载器,而不能反过来访问,因此在查找类时,类加载器将查看自己的类,然后向其父类加载器询问特定的类


这就是为什么您可以从webapp访问共享类加载器中的类,但不能反过来访问。

好的,谢谢您的解释,由于放置在tomcat共享库中的库应该用于所有不同部署的Web应用程序,我想它需要一个these@Redemin:请注意,Tomcat的类加载器层次结构并不意味着您需要将JAR实际放置在
WEB-INF/lib
中。这也可以通过将JAR留在外部位置来完成。Tomcat 7有一个错误。