控制servlet中的类路径

Ian*_*son 6 java tomcat servlets classpath

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

Yon*_*man 15

Tomcat 8.5

Ditto Tomcat 8.0.

请参阅文档:Class Loader HOW-TO.

Tomcat 8.0

答案很简单,取自Tomcat文档页面,Class Loader HOW-TO.特别注意/WEB-INF/目录/文件夹的使用.

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

  • JVM的Bootstrap类
  • /WEB-INF/classes 您的Web应用程序
  • /WEB-INF/lib/*.jar 您的Web应用程序
  • 系统类加载器类(如上所述)
  • 常见的类加载器类(如上所述)

如果配置了Web应用程序类加载器,<Loader delegate="true"/>则订单变为:

  • JVM的Bootstrap类
  • 系统类加载器类(如上所述)
  • 常见的类加载器类(如上所述)
  • /WEB-INF/classes 您的Web应用程序
  • /WEB-INF/lib/*.jar 您的Web应用程序

雄猫6

摘自Tomcat 6页,Class Loader HOW-TO.

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

  • JVM的Bootstrap类
  • 系统类加载器类(如上所述)
  • /WEB-INF/classes 您的Web应用程序
  • /WEB-INF/lib/*.jar 您的Web应用程序
  • $CATALINA_HOME/lib
  • $CATALINA_HOME/lib/*.jar


joh*_*tok 5

据我了解,从类路径中选择的资源是不确定的(从应用程序开发人员的角度来看)。即使始终加载相同的文件,行为也可能会发生变化: 1. 当您升级当前容器的版本时。2.如果你切换容器。

最简单的解决方案是从库 jars 中删除嵌入的 log4j 配置文件。嵌入 log4j 配置几乎从来都不是一个好主意,因为它会导致您在这里看到的问题......

他们是第三方罐子还是你开发的罐子?