gpt4 book ai didi

java - Maven Surefire 测试中的 ClassNotFoundExceptions

转载 作者:行者123 更新时间:2023-11-30 07:23:33 25 4
gpt4 key购买 nike

在 Maven Surefire 中执行测试时,我不时会看到 ClassNotFoundException

这确实让我头疼,因为:

  • 缺失的类各不相同。只有大约 5 个类受到影响,但具体影响哪个类因构建而异。不过,我认为这些类之间没有任何独特的相似之处,它们与其他 20 个同类类也没有相似之处。
  • 这些缺失的类来自 2 个不同的依赖项。当然,这些是由 Maven 管理的。
  • 当引发 CNFE 时,我查看了类路径(在运行时!),它看起来很好!

我如何分析类路径

我取了"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;
}

URL 列表非常短:

  • 一些 JRE 库
  • 一个“万无一失的启动 jar ”

后一个 jar 将我的所有 Maven 依赖项捆绑在其 list 文件 as described in the Surefire docs. 中。

因此,我进一步挖掘并分析了 list 的“Class-Path”属性。在那里我找到了列出的依赖 jar,缺少的类应该来自其中。当浏览 jar 的条目时,我还发现了缺少的类。完全限定路径也匹配。

所以原则上一切似乎都是正确且就位的。我现在应该在哪里继续调查?

最佳答案

对于此类问题,需要检查多项内容。

  • 这种情况是通过命令行还是仅通过 CI 构建发生?如果使用 Jenkins 或 Hudson,这是 Maven 项目还是具有 Maven 构建步骤的 FreeStyle 项目?如果这是一个 Maven 项目,请将其切换到具有 Maven 构建步骤的 FreeStyle 项目,这样就可以解决问题。 Maven 团队的 Stephen Connolly 认为 Jenkins Maven build type evil .
  • 确保每个依赖项只有一个版本,并且相关依赖项(Spring、ASM、Hibernate 等)具有相同/兼容的版本。请特别注意组 ID 或 Artifact ID 已更改的 Artifact ,例如 spring.jarspring-core.jar。老Tattletale plugin可能对入门有用。
  • 将所有以 -all 结尾的依赖项替换为其组成部分。 -所有 jar 可能包含运行库所需的每个类 - 重新打包到 jar 文件中,Maven 的依赖项解析过程无法获取它们 - 而不是将它们作为依赖项引用。 mockito-all、hamcrest-all、powermock-all、cglib 都是示例。
  • 如果使用覆盖工具(Jacoco、Clover),如果关闭覆盖范围,构建是否会正常工作?如果是,该工具可能会引入与您的应用程序冲突的类路径 jar。 (例如不同版本的 CGLIB。)在 Debug模式下运行并比较有/没有覆盖的依赖关系以识别差异。
  • 如果使用 JUnit,请确保 Maven Surefire 使用适合您的 JUnit 版本的正确 JUnit 提供程序。使用 -X 在 Debug模式下运行构建(如果使用命令行,则将输出重定向到文件)。 Grep Surefire-junit 的输出。你应该找到这样的东西:

    [DEBUG] org.apache.maven.surefire:surefire-junit4:jar:2.16:test(选择用于测试)

    现在,确保提供程序的版本与所使用的 JUnit 版本相匹配。查看Maven docs有关使用哪个提供程序以及如何配置的信息。

关于java - Maven Surefire 测试中的 ClassNotFoundExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com