在Maven Surefire中执行测试时,我不时会看到ClassNotFoundException
。
这真让我头疼,因为:
CNFE
被提升时,我看了一下类路径(在运行时!),它看起来很好!我从Arno Haase那里获取了"class path scanner"的代码:
public List<URL> getRootUrls () {
List<URL> result = new ArrayList<> ();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
while (cl != null) {
if (cl instanceof URLClassLoader) {
URL[] urls = ((URLClassLoader) cl).getURLs();
result.addAll (Arrays.asList (urls));
}
cl = cl.getParent();
}
return result;
}
网址列表很短:
后一个jar将我的所有Maven依赖项捆绑在其清单文件as described in the Surefire docs.
中所以我进一步挖掘并分析了清单的“Class-Path”属性。在那里,我发现列出了依赖jar,缺少的类应该来自哪里。 浏览jar的条目时,我还在那里找到了缺少的课程。完全限定的路径也匹配。
所以原则上一切似乎都是正确的。 我现在应该继续调查哪些内容?
答案 0 :(得分:1)
有几件事要检查这些问题。
spring.jar
与spring-core.jar
。开始使用旧的Tattletale plugin可能很有用。如果使用JUnit,请确保Maven surefire正在为您的JUnit版本使用正确的JUnit提供程序。使用-X
在调试模式下运行构建(如果使用命令行,则将输出重定向到文件)。 Grep surefire-junit
的输出。你应该找到这样的东西:
[DEBUG] org.apache.maven.surefire:surefire-junit4:jar:2.16:test(选择进行测试)
现在,确保提供程序的版本与使用的JUnit版本匹配。查看Maven docs,了解有关使用哪个提供商以及如何配置的信息。