2016-08-22 147 views
0

我们使用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) 
+2

删除'log4j.jar'。如果您无法修复该jar以不依赖于Log4j SPI,则可能必须手动编写存根/代理,因此它将在没有Log4j的情况下运行。 – Andreas

回答

0

您可以排除由包含它的依赖项导入的传递性log4j依赖项。

在你的pom.xml你可以告诉,以排除log4j的更新依赖进口:

<dependencies> 
    <dependency> 
    <groupId>the.group.id</groupId> 
    <actifactId>the.artifact.id</artifactId> 
    <version>version-SNAPSHOT</version> 
    <exclusions> 
     <exclusion> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
</dependencies>