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

单个项目中的Java库使用不同版本的log4j,java,spring,logging,log4j,Java,Spring,Logging,Log4j,我的问题是,我正在构建SpringBoot项目,并且我正在使用其他一些使用log4j 1.2.8的项目中的A类。当我强制弹簧使用log4j 1.2.8时,我有以下错误: org.springframework.beans.factory.BeanCreationException:错误 正在创建名为“jettyEmbeddedServletContainerFactory”的bean 类内路径资源 [org/springframework/boot/autoconfigure/web/Embed

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

org.springframework.beans.factory.BeanCreationException:错误 正在创建名为“jettyEmbeddedServletContainerFactory”的bean 类内路径资源 [org/springframework/boot/autoconfigure/web/EmbeddedServletContainerAutoConfiguration$EmbeddedJetty.class]: bean初始化失败;嵌套异常
上的是org.springframework.beans.factory.BeanCreationException:错误 创建名为的bean 'org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration': 自动连线依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法 自动连线字段:专用 org.springframework.boot.autoconfigure.web.ServerProperties org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration.properties; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 正在创建在类路径中定义了名称为“serverProperties”的bean 资源 [org/springframework/boot/autoconfigure/web/ServerPropertiesAutoConfiguration.class]: bean初始化失败;嵌套异常是 java.lang.NoSuchFieldError:跟踪

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

java.lang.NoSuchMethodError: org.apache.log4j.LogManager.exists(Ljava/lang/String;)Lorg/apache/log4j/Logger


除了升级我的A类log4j之外,还有其他解决方案吗?也许有什么方法可以在运行时强制某些类使用log4j1.2.8,而其他类则使用1.2.12

最简单的解决方案是升级您的项目A。更新日志库的风险很小,摆弄不同的库版本可能会让人感到乏味和困惑


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

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

就是这样一种技术,您可以在一个JVM运行时拥有同一库的多个版本


然而,在大多数情况下,它被过度使用了。和其他人的建议一样,升级源代码的方式要便宜得多。

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

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

您描述了一种方法,强制Spring使用旧的log4j。但另一方面呢?当类路径上只有log4j 1.2.12时,针对旧版本构建的类是否有任何问题?Spring在slf4j上使用log4j,正如您所看到的,这个类没有实现我的类正在使用的exists方法。