有没有人知道在哪个地方指定顺序,在tomcat8中装入jars中的哪些类?
这是我们的场景:我们有两个完全相同的服务器(硬件和操作系统)。两者都在运行java 1.7.65,并且都安装了版本8.0.32的tomcat。启动参数和VM参数以及特定于应用程序的设置完全相同(第二台机器只是一个冗余系统)。唯一的区别是ip地址,当然还有主机名。
在最近从Tomcat7升级到Tomcat8 (在两个系统上)之后,很长一段时间都忽略了来自slf4j的消息“找到多个绑定...”在应用程序启动时,我们遇到了另一种情况,它导致了一个错误,使我们的应用程序无法正确地记录日志--类加载的排序/排序。这是因为一个系统先加载logback-classic-1.0.13.jar,然后在第二个系统slf4j-log4j12-1.6.6.jar上先加载。我们只部署了一个logback.xml,没有部署log4j.xml,因此日志消息不会出现在正确的文件中,因为加载的StaticLoggerBinder不是正确的。
system-1的输出
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/backoffice/apache-tomcat-8.0.32/webapps/backoffice/WEB-INF/lib/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/backoffice/apache-tomcat-8.0.32/webapps/backoffice/WEB-INF/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
16:50:26,740 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
16:50:26,740 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
16:50:26,741 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/opt/backoffice/apache-tomcat-8.0.32/webapps/backoffice/WEB-INF/classes/logback.xml]
system-2的输出
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/backoffice/apache-tomcat-8.0.32/webapps/backoffice/WEB-INF/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/backoffice/apache-tomcat-8.0.32/webapps/backoffice/WEB-INF/lib/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
(是的,我知道如何通过maven依赖来修复它,我肯定会从我的pom中删除重复/冗余的依赖...O:-) )
现在我的问题是,在两个完全相同的系统上,顺序怎么可能不同?
发布于 2016-04-05 23:47:07
Java按照类路径中指定的顺序加载类。
Tomcat不像其他Java程序那样解析类路径,例如使用CLASSPATH环境变量或-classpath命令行标志。另外,Tomcat解析类路径的方式可以而且确实会随着每个主要版本的发布而变化(这可能就是引入您的问题的原因)。
我在你的未来看到了很多关于这方面的阅读:)这里是一个很好的开始:Understanding the Tomcat classpath
https://stackoverflow.com/questions/36430282
复制相似问题