【问题标题】:Junit fails to run with java.lang.LinkageError duplicate class definition for name with log4j classesJunit 无法运行 java.lang.LinkageError 与 log4j 类的名称重复类定义
【发布时间】:2021-01-15 13:40:14
【问题描述】:

当我运行我的单元测试时,我从构建的测试运行阶段收到抱怨说我的类路径中有一个重复的类。我最近没有更改我的依赖项,所以这很令人惊讶。

[junit] 线程“Thread-4”中的异常 java.lang.LinkageError: loader (org/powermock/core/classloader/MockClassLoader 的实例): 尝试重复的名称类定义: "org/apache/log4j/pattern/Log4j1MdcPatternConverter"

当我尝试使用@PowerMockIgnore 注释排除该模式时,相关类会发生变化,例如,如果我这样做:

@PowerMockIgnore({"org.apache.log4j.pattern.Log4j1MdcPatternConverter"})

它只是抱怨另一个重复的类,如 Log4j1XmlLayout 或 Log4j1NdcPatternConverter。我可能可以蛮力排除哪些,但是在知道要使用的排除模式之前,有没有人看到过这个问题?我使用的格式类似于this question about LinkageErrors in unit tests,但用于不同的类。

其他一些问题和答案提到他们改变了他们与 log4j 和其他 Apache 相关包的依赖关系的顺序;在这种情况下,我无法更改依赖项的加载顺序,因为我无法在构建环境中控制它们(即我无法在 Maven 或 Gradle 中更改某些内容)。我正在寻找可能的最小更改,这应该只是在失败的测试类的顶部放置一个 PowerMockIgnore 注释。

【问题讨论】:

    标签: java junit log4j powermock powermockito


    【解决方案1】:

    经过大量的蛮力,这是使测试运行而没有重复的类投诉的模式(把它放在你的类的顶部)

    @PowerMockIgnore({
        "org.apache.log4j.pattern.Log4j1MdcPatternConverter",
        "org.apache.log4j.pattern.Log4j1NdcPatternConverter",
        "org.apache.log4j.layout.Log4j1XmlLayout",
        "org.apache.logging.log4j.*",
        "org.apache.logging.log4j.core.*"
    })
    

    注意必须排除的各个类,没有通配符,才能加载和运行。

    【讨论】:

      猜你喜欢
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2017-08-22
      • 2017-09-14
      • 1970-01-01
      • 2018-08-01
      • 2016-07-17
      相关资源
      最近更新 更多