我们使用log4j-over-slf4j
来登录我们的应用程序。但是在我们的应用程序中的一个jar依赖项(External to us)需要log4j特定的类(org.apache.log4j.spi.RepositorySelector
)。所以,我已经在我们的类路径中添加了log4j,并且它能够找到该类, 但是,然后我开始面对新的问题,在我的代码中,我正在从LogManager加载RepositorySelector, LogManager.setRepositorySelector(repoSel, guard);
现在,不是引用log4j具体LogManager
,它是指log4j-over-slf4j
特定LogManager
,由于这个原因,我在websphere服务器控制台中出现错误。log4j和log4j-overslf4j都在LogManager中的类路径冲突中
Caused by: java.lang.NoSuchMethodError: org/apache/log4j/LogManager.setRepositorySelector(Lorg/apache/log4j/spi/RepositorySelector;Ljava/lang/Object;)V**
请帮助我知道,我们如何才能消除该冲突,所以,它能够引用特定LogManager
适当log4j1.2.15。 而且,因为使用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的情况下运行。 – Andreas