我对这件事已经有一段时间了。stackoverflow中的相关问题是关于 hamcrest-core
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);
}
}
这是测试 shouldAnswerWithTrue
调用方法 assertTrue
在班上 Assert
从依赖关系 junit
版本4.11(在pom中声明)。当我构造相应的调用图时,依赖关系 hamcrest-core
似乎没有在这个测试用例中使用。 hamcrest-core
是由直接依赖关系引起的传递依赖关系 junit
. 因此,我将其从我的项目pom中排除如下:
<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
在我的测试及其任何方法调用中根本没有使用的依赖项中。我已经查过了 hamcrest-core
是从 Assert
junit课程。
那么,为什么我不能排除 hamcrest-core
? 为什么需要这个接口?它叫什么名字?
1条答案
按热度按时间n3ipq98p1#
因为JUnit4.11实际上在编译时依赖于它:它在其异常层次结构中使用它。当
AssumptionViolatedException
类,它将触发SelfDescribing
.