我在Tomcat 6上安装了Java 6应用程序。应用程序jar文件和依赖项jar文件位于我的webapps / myapp / WEB-INF / lib目录中,而我的登录配置文件位于webapps / myapp / WEB-INF / classes中。
该应用程序是唯一在tomcat实例中运行的应用程序,我们一次运行约100个实例。服务器管理团队认为应用程序库和依赖库是多余的,并将它们移至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),然后在每个web应用程序的WEB-INF/lib目录下创建指向这些jar的符号链接。
tomcat/lib
WEB-INF/lib
我已经使用此设置多年,对我来说效果很好。您可以创建一个扫描通用jars目录的shell脚本并为每个Web应用程序创建符号链接,并且可以将该脚本设置为在Tomcat启动时自动运行(例如,通过Tomcat的启动脚本调用它)。