代码之家  ›  专栏  ›  技术社区  ›  Ian Dickinson

控制servlet中的类路径

  •  6
  • Ian Dickinson  · 技术社区  · 16 年前

    我的servlet应用程序包括许多library.jar,其中一些包含嵌入的log4j.xml或log4j.properties文件。我想确保log4j首先找到我的log4j.xml!我尝试过搜索servlet中各种类路径元素的优先级规范(例如,WEB-INF/classes是否总是在WEB-INF/lib之前?),或者以某种方式配置或调整servlet的类加载器,以便给定的资源目录在类路径的早期出现。到目前为止,我已经画了一个空白。关于确保servlet.war文件通过类加载器加载正确的log4j.xml,有什么建议吗?

    6 回复  |  直到 16 年前
        1
  •  15
  •   Basil Bourque    7 年前

    Tomcat 8.5

    Tomcat 8.0也是如此。

    见文件: Class Loader HOW-TO

    Tomcat 8.0

    Class Loader HOW-TO . 特别注意 /WEB-INF/ 目录/文件夹。

    • JVM的引导类
    • /WEB-INF/classes 您的web应用程序的
    • /WEB-INF/lib/*.jar 您的web应用程序的
    • 通用类加载器类(如上所述)

    如果web应用程序类加载器是 configured <Loader delegate="true"/> 然后,顺序变为:

    • JVM的引导类
    • 通用类加载器类(如上所述)
    • 您的web应用程序的
    • /WEB-INF/lib/*.jar

    雄猫6

    摘自Tomcat 6页, Class Loader HOW-TO

    因此,从web应用程序的角度来看,类或资源加载按以下顺序查看存储库:

    • JVM的引导类
    • 系统类加载器类(如上所述)
    • 您的web应用程序的
    • $CATALINA_HOME/lib
    • $CATALINA_HOME/lib/*.jar
        2
  •  5
  •   johnstok    16 年前

    据我所知,从类路径选择资源是不确定的(从应用程序开发人员的角度)。即使一致加载同一文件,行为也可能发生变化: 1.升级当前容器的版本时。

    . 嵌入log4j配置几乎从来都不是一个好主意,因为它会导致您在这里看到的问题。。。

    它们是第三方罐还是您开发的罐?

        3
  •  3
  •   user7094 user7094    16 年前

    Log4jConfigListener 在我们的web.xml文件中。

    这是你的选择吗?如果您不使用Spring,我知道您可以通过编程方式设置Log4j位置,这也可能会起作用。

        4
  •  1
  •   Jack Leow    16 年前

    根据我的经验,WEB-INF/classes通常优先于WEB-INF/lib中的JAR,但是,这也取决于您使用的servlet容器(例如,我永远无法理解JRun的行为)。如果你能告诉我你用的是哪一个容器,那将非常有帮助。

    另外,您确定有问题的log4j配置在WEB-INF/lib的jar中吗?通常,当我在servlet容器的情况下遇到类路径问题时,这是因为驻留的库 外部

    servlet规范 推荐

        5
  •  1
  •   matt b    16 年前

    log4j.configuration ? 我相信该属性指向的位置可以在类路径之外设置。

    如果不是,另一种方法(虽然很难看)是在应用程序代码中自己显式运行一个配置程序。

        6
  •  -1
  •   Marko    16 年前

    在类路径中需要有log4j.properties。最好的位置是WEB-INF/classes下。

    您还必须确保使用您的log4j.jar版本。所以,将它放在WEB-INF/lib中,只是为了确保您没有使用来自tomcat文件夹的文件,因为它可能会导致奇怪的类加载问题。