java - 如果我在 Maven 测试中根本没有使用 hamcrest,为什么我会得到 NoClassDefFound org/hamcrest/SelfDescribeing?
问题描述
我已经有一段时间了。StackOverflow中的相关问题是关于hamcrest-core
项目的classpath中没有JAR,解决方法都与它的添加有关。我想做的是相反的:从类路径中删除这个依赖。
考虑一个带有单个测试用例的 Maven 项目:
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class AppTest {
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue() {
assertTrue(true);
}
}
这里测试从依赖版本 4.11(在 POM 中声明)shouldAnswerWithTrue
调用assertTrue
类中的方法。当我构造相应的调用图时,这个测试用例中似乎没有使用依赖项。是由直接依赖引起的传递依赖。因此,我继续将其从我的项目的 POM 中排除,如下所示:Assert
junit
hamcrest-core
hamcrest-core
junit
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
但是,当我执行时mvn package
,它会触发以下错误:
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
我不明白为什么 Java 会抱怨SelfDescribing
我的测试及其任何方法调用中根本没有使用的依赖项中的接口。我已经检查过没有从JUnit 中hamcrest-core
的类加载任何类。Assert
那么,为什么我不能排除hamcrest-core
?为什么需要这个接口?它叫什么名字?
解决方案
因为 JUnit 4.11 实际上在编译时依赖它:它在其异常层次结构中使用它。当AssumptionViolatedException
类被加载时,它会触发一个SelfDescribing
.
推荐阅读
- javascript - 通过谷歌应用脚本授予谷歌驱动器上的文件访问权限
- ethereum - 如何向业主地址付款?
- excel - 在重新激活工作簿时执行操作
- java - 为什么调用数组的位置比调用变量更糟糕
- r - 如何编写此 R 计数查询?
- sql-server - SQL Server 2008 R2 - 传递的长度参数无效
- android - ConstraintLayout 中的 Textviews 对齐
- session - SQL Server 总是每小时运行一次查询
- gradle - ShadowJar:没有为属性“mainClassName”指定值
- ios - 使用 SKCloudServiceController API 检查 Apple Music 功能时出错