java - Tomcat 8 中的类路径和 jar 文件加载顺序

标签 java tomcat logging classloader logback

<分区>

有谁知道在tomcat8中加载jar类的顺序指定的地方吗?

这是我们的场景: 我们有两个完全相同的服务器(硬件和操作系统)。两者都运行 java 1.7.65,并在 8.0.32 版本中安装了 tomcat。 启动和 VM 参数完全相同,以及特定于应用程序的设置(第二台机器只是一个冗余系统)。唯一的区别是 IP 地址,当然还有主机名。

最近从 Tomcat7 升级到 Tomcat8(在两个系统上)后,长时间忽略来自 slf4j 的消息,在应用程序启动时说“找到多个绑定(bind)...”将我们带到另一种情况,导致错误阻止我们的应用程序正确的日志记录 - 类加载的排序/排序。 那是因为一个系统首先加载 logback-classic-1.0.13.jar,而在第二个系统上首先加载 slf4j-log4j12-1.6.6.jar。我们只有一个 logback.xml 而没有部署 log4j.xml,因此日志消息没有出现在正确的文件中,因为加载的 StaticLoggerBinder 不正确。

系统 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]

系统 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:-))

现在我的问题是,两个完全相同的系统上的顺序怎么可能不同?

最佳答案

Java 按照类路径中指定的顺序加载类。

Tomcat 不像其他 Java 程序那样解析类路径,例如使用 CLASSPATH 环境变量或 -classpath 命令行标志。此外,Tomcat 解析类路径的方式可以并且确实会随着每个主要版本的变化而变化(这可能就是引入您的问题的原因)。

我在你的 future 看到了很多这方面的阅读:) 这是一个很好的开始:Understanding the Tomcat classpath

关于java - Tomcat 8 中的类路径和 jar 文件加载顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430282/

相关文章:

java - Java 和 PHP 应用程序

java - 比较元素列表和字符串数组

java - 日志解析器解决方案 python/perl 与 Java

java - 在 Java 中,如何确保捕获和记录的所有异常在我的系统中提供堆栈跟踪?

Java如何在Apache POI上进行搜索和替换时避免覆盖模板文件

java - 借助 BeanShell 调用嵌入代码中的方法

linux - 从公共(public) IP 访问应用程序

apache - 在tomcat上运行web服务的正确方法是什么

java - 如何加速 Tomcat SSL 初始化

android - 如何从 Slog 中查看日志