问题 log4j:错误“org.apache.log4j.ConsoleAppender”对象不能分配给“org.apache.log4j.Appender”变量


我正在使用gradle创建一个Web应用程序。我在这个应用程序中使用了log4j。当我构建项目时,我收到错误...

  • log4j:错误“org.apache.log4j.ConsoleAppender”对象不能分配给“org.apache.log4j.Appender”变量。
  • log4j:ERROR加载了“org.apache.log4j.Appender”类
  • log4j:ERROR [org.powermock.core.classloader.MockClassLoader@16a40b2]而对象类型
  • log4j:ERROR“org.apache.log4j.ConsoleAppender”由[sun.misc.Launcher$AppClassLoader@5e3a78ad]加载。
  • log4j:ERROR无法实例化名为“stdout”的appender。

我仍然没有找到一个好的答案。我忘了说,我的项目正确构建并正确显示日志按摩。它不仅适用于测试类。


12048
2018-01-13 11:58


起源

该 ConsoleAppender class以某种方式被PowerMock的类加载器加载,并且没有正确链接到基类 Appender 类型。 - chrylis


答案:


添加此注释对我有用。

@PowerMockIgnore("org.apache.log4j.*") 

10
2017-10-02 15:13



但是您正在压制这些错误消息而不是修复它们。 - Roberts Kalderauskis


您的类路径包含2个log4j库副本。排除一个并重试。


4
2018-01-13 12:24



我刚用过log4j-1.2.17,slf4j-log4j12-1.7.5和slf4j-api-1.7.5。而slf4j就是门面。 - Kasun Kariyawasam
如何检查我是否有2份?以及如何解决?我应该删除一个吗? - Yestay Muratov
@YestayMuratov通过分析您的类路径,它取决于您的应用程序的类型:它是部署到应用程序服务器的Web应用程序,还是任何类型的桌面/控制台应用程序。您必须删除一个,但这取决于这些库的兼容性。由于语义版本控制,如果这些库的主要版本不同,您的代码可能与从外部进入类路径的库版本不兼容。 - artplastika


有一个明确的答案 这里。 :d

当我们在我们的类中有最终方法和slf4j记录器时。我们必须在测试类中使用powermock。因此,我们必须在我们使用Powermock的测试类中使用@MockPolicy(Slf4jMockPolicy.class)和特定的导入。


2
2018-01-16 11:53



OP并没有说他们正在使用slf4j。 @ToYonos发布的答案更合适。 - Matthew Wise