单个项目中的Java库使用不同版本的log4j

时间:2014-08-29 07:51:25

标签: java spring logging log4j

我的问题是我正在构建spring-boot项目,并且我正在使用其他使用log4j 1.2.8的项目中的A类。当我强制spring使用log4j时1.2.8我有以下错误:

  

org.springframework.beans.factory.BeanCreationException:错误   创建名为' jettyEmbeddedServletContainerFactory'的bean定义   在类路径资源中   [组织/ springframework的的/ boot /自动配置/网络/ EmbeddedServletContainerAutoConfiguration $ EmbeddedJetty.class]:   bean的初始化失败;嵌套的例外   on是org.springframework.beans.factory.BeanCreationException:错误   用名字创建bean   ' org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration&#39 ;:   注入自动连接的依赖项失败;嵌套异常是   org.springframework.beans.factory.BeanCreationException:不能   autowire字段:私有   org.springframework.boot.autoconfigure.web.ServerProperties   org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration.properties;   嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为' serverProperties'的bean在类路径中定义   资源   [组织/ springframework的的/ boot /自动配置/网络/ ServerPropertiesAutoConfiguration.class]:   bean的初始化失败;嵌套异常是   java.lang.NoSuchFieldError:TRACE

Spring至少需要log4j 1.2.12,所以当我使用这个版本的log4j时,我的A类有以下错误:

  

java.lang.NoSuchMethodError:   org.apache.log4j.LogManager.exists(Ljava /郎/字符串;)Lorg /阿帕奇/ log4j的/记录器;

除了升级我的A类log4j之外,还有其他解决方案吗?也许有任何方法在运行时强制某些类应该使用log4j 1.2.8而其他类将使用1.2.12?

4 个答案:

答案 0 :(得分:2)

OSGI是一种技术,您可以在一个JVM运行时中拥有相同库的多个版本。

然而,对于大多数情况来说,这是过度的。与其他人一样的建议,升级源代码会更便宜。

答案 1 :(得分:2)

解决这个问题很容易。我在评论中提到spring使用log4j-over-slf4j,它没有实现我的Class正在使用的LogManager.exists方法。我刚刚从我的项目(gradle)中排除了log4j-over-slf4j,并将依赖性添加到log4j,如下所示。

configurations {
    compile.exclude module: 'log4j-over-slf4j'
}
compile group: 'log4j', name: 'log4j', version: '1.2.17'

答案 2 :(得分:1)

最简单的解决方案是升级您的项目A.更新日志库是一个小风险,摆弄不同的库版本可能是乏味和混乱。

免责声明:我不熟悉spring-boot,也许它有一个聪明的方法来处理这个问题。

答案 3 :(得分:1)

我强烈建议升级使用较旧的log4j版本产生问题的类。据我所知,你能做的每一件事都会比升级更复杂。你可以在他们自己的类加载器中分成两个不同的项目或者类似的东西..基本上就像tomcat一样可以实现多个java web应用程序..但是你必须看看它们如何通信等等...所以我假设大多数解决方案会使它变得比它需要的更复杂,或者应该