【问题标题】:Failed to load ApplicationContext in tests when maven-shade-plugin is used使用 maven-shade-plugin 时无法在测试中加载 ApplicationContext
【发布时间】:2021-01-23 16:37:05
【问题描述】:

我有这个测试

@RunWith(SpringRunner.class)
@ContextConfiguration(locations = "classpath:some-context-test.xml")
@DirtiesContext
public class SomeClassIT {
  ...
  @Test
  public void someTestMethod() {
    ...
  }
  ...
}

从 IntelliJ IDEA 触发时运行没有问题,但因错误而失败

[ERROR] someTestMethod(x.y.z.SomeClassIT)  Time elapsed: 0.001 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name
 'entityManagerFactory' defined in class path resource [META-INF/db.xml]: Invocation of init method
 failed; nested exception is org.hibernate.AssertionFailure: AttributeConverter class [class x.y.z.SomeConverter]
 registered multiple times
Caused by: org.hibernate.AssertionFailure: AttributeConverter class [class x.y.z.SomeConverter] registered
 multiple times

当通过 maven 执行时

mvn verify -DskipITs=false

但是,如果我从 pom.xml 中删除 maven-shade-plugin 配置(项目正在使用它),那么即使通过 maven,测试也会成功执行。

【问题讨论】:

    标签: java spring maven integration-testing maven-shade-plugin


    【解决方案1】:

    在此问答中找到了解决方案:https://stackoverflow.com/a/56589859/2806801。 maven-failsafe-plugin的参数classpathDependencyScopeExclude

    <project>
      [...]
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>[...]</version>
            <configuration>
              <classpathDependencyScopeExclude>runtime</classpathDependencyScopeExclude>
            </configuration>
          </plugin>
        </plugins>
      </build>
      [...]
    </project>
    

    详情

    由于 maven-shade-plugin,META-INF/db.xml(由 some-context-test.xml 导入)被加载了两次:

    1. jar:file:/C:/Users/.../project/module1/target/module1-v.1.0.0-SNAPSHOT.jar!/META-INF/db.xml
    2. jar:file:/C:/Users/.../.m2/repository/.../project/module2/1.0.0/module2-1.0.0.jar!/META-INF/db.xml

    在我将参数 classpathDependencyScopeExclude 设置为 runtime 后,META-INF/db.xml 仅从以下位置加载

    1. jar:file:/C:/Users/.../project/module1/target/module1-v.1.0.0-SNAPSHOT.jar!/META-INF/db.xml

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多