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 。
希望这可以帮助!
- MQJE001:完成代码’2’,原因’2538′
- Java – javax.net.ssl.SSLPeerUnverifiedException:peer未经过身份validation
- Guice:Binder#bindConstant()和Binder#bind()… toInstance之间的区别
- 如何修复java.lang.ClassCastException:无法将scala.collection.immutable.List的实例分配给字段类型scala.collection.Seq?
- 如何确定使用Spring Security访问URL所需的角色?
- 标记界面的目的是什么?
- 当项目转换为可执行jar时,序列化文件不起作用?
- 将JScrollPane滚动到JTable上的特定行
- 使用System.setOut()重定向Runtime.getRuntime()。exec();