web app和依赖jar转移到Tomcat 6 lib目录,logback找不到配置文件

我在Tomcat 6上安装了一个Java 6应用程序。应用程序jar文件和依赖jar文件存在于我的webapps / myapp / WEB-INF / lib目录中,而我的logback配置文件存在于webapps / myapp / WEB-INF / classes中。

该应用程序是唯一一个在tomcat实例中运行的应用程序,我们一次运行大约一百个实例。 服务器管理团队决定应用程序和依赖库是冗余的,并将它们移动到tomcat / lib。

首先,他们将myapp.jar移动到tomcat / lib。 这导致了一个例外:

java.lang.ClassNotFoundException: org.slf4j.LoggerFactory at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

这有点奇怪,因为,如果有的话,我会期望它尝试加载我的应用程序失败。 相反,似乎从tomcat / lib中的jar加载应用程序已经改变了类加载器的路径。 我认为web应用程序目录,当然还有WEB-INF / web.xml,会将类加载器“锚定”到应用程序目录。 似乎并非如此。

当这不起作用时,管理团队将所有其余的依赖库移动到tomcat / lib目录。 现在应用程序启动,找到它的配置属性文件等,但找不到logback.xml文件(在WEB-INF / classes / logback.xml中)。 同样,这表明类加载器环境中的某些事情发生了重大变化。

最重要的结果是,如果我在WEB-INF / lib目录中放置一个新的依赖项,我的应用程序就不再看到它了。 当然,再次看到我的日志配置文件而不必将其移动到tomcat / lib也会很高兴。

关于我的配置发生了什么的任何想法?

如果您的服务器在Linux上运行,则有一种替代设置可以防止这些类加载器问题,并且(可能)使您的服务器管理员满意。 您可以将公共jar放在某个目录中( 不在 tomcat/lib ),然后在每个webapp的WEB-INF/lib目录下为这些jar创建符号链接。

我已经使用了这个设置多年,它对我来说效果很好。 您可以创建一个shell脚本来扫描公共jars目录并为每个webapp创建符号链接,并且您可以将此脚本设置为在Tomcat启动时自动运行(例如,通过从Tomcat的启动脚本调用它)。

我刚刚用自己的项目解决了类似的问题。 对于初学者,请确保logback.xml文件实际位于生成的.war文件中,以及应用程序所期望的位置。 如果您使用的是Mac,请查看Jarzilla以检查WAR和JAR的内容,而无需提取它们。 事实certificate这是我的问题。

此外,如果您遇到依赖性问题,那么您可能需要查看项目构建管理器,如Apache Maven或Gradle甚至Apache Ant 。

希望这可以帮助!