【发布时间】:2016-12-28 13:54:10
【问题描述】:
我们使用log4j-over-slf4j 登录我们的应用程序。但是我们的应用程序中的一个 jar 依赖项(我们外部)需要 log4j 特定的类(org.apache.log4j.spi.RepositorySelector)。所以,我也在我们的类路径中添加了 log4j,它能够找到那个类,
但是,然后我开始面临新问题,在我的代码中,我正在从 LogManager 加载 RepositorySelector,
LogManager.setRepositorySelector(repoSel, guard);
现在,不是指特定于 log4j 的 LogManager,而是指特定于 log4j-over-slf4j 的 LogManager,因此,我在 websphere 服务器控制台中遇到以下错误。
原因:java.lang.NoSuchMethodError: org/apache/log4j/LogManager.setRepositorySelector(Lorg/apache/log4j/spi/RepositorySelector;Ljava/lang/Object;)V**
请帮助我知道,我们怎样才能消除冲突,以便它能够引用正确的 log4j1.2.15 特定 LogManager。
而且,由于使用 log4j 的 jar 在我们的系统之外,我们对此没有太多控制权。
下面是完整的堆栈跟踪。
Caused by: java.lang.NoSuchMethodError: org/apache/log4j/LogManager.setRepositorySelector(Lorg/apache/log4j/spi/RepositorySelector;Ljava/lang/Object;)V
at com.hsbc.es.logging.def.impl.log4j.Log4jLoggingTypeProvider.setContextualRepositorySelector(Log4jLoggingTypeProvider.java:117)
at com.hsbc.es.logging.def.impl.log4j.Log4jLoggingTypeProvider.<clinit>(Log4jLoggingTypeProvider.java:97)
at java.lang.J9VMInternals.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1887)
at com.hsbc.es.logging.LoggingTypeManagerFactory.discoverContextLoggingTypeManagerSPI(LoggingTypeManagerFactory.java:168)
at com.hsbc.es.logging.LoggingTypeManagerFactory.getContextLoggingTypeManagerSPI(LoggingTypeManagerFactory.java:98)
at com.hsbc.es.logging.def.LoggingTypeProviderFactory.getContextLoggingTypeProvider(LoggingTypeProviderFactory.java:49)
at com.hsbc.es.logging.def.LoggingTypeFactory.getDebugger(LoggingTypeFactory.java:58)
【问题讨论】:
-
删除
log4j.jar。如果您无法将 jar 修复为不依赖 Log4j SPI,则可能必须手动编写存根/代理,这样它就可以在没有 Log4j 的情况下运行。