在使用 Maven 运行测试时,我遇到了由 ClassNotFoundException 引起的 NoClassDefFoundError。找不到的类肯定存在于我的本地存储库中。
有问题的依赖项如下所示:默认作用域依赖项依赖于一个 jar,该 jar 的作用域标记为已提供,并且类加载器未找到的文件位于该 jar 内。它编译正常,在运行应用程序时找不到文件。
我已经通过将“提供的 jar”明确添加到我的 pom 作为运行时范围的依赖项来修复错误,但我想了解发生了什么。
1)如果我正在运行一些测试,依赖范围=提供的含义是什么?我知道一个servlet容器可以有一些提供的jar,比如servlet-api.jar,但是测试呢?这看起来像是我们的 pom 中的一个错误,不是吗?当我们应该使用“提供”范围时,除了 servlet-api.jar(和类似的 web-server jars)还有其他情况吗?
2)我在寻找这个问题的解决方案时尝试使用maven命令行参数-U。据我了解,它强制 Maven 检查远程存储库并在必要时从那里获取最新的依赖项。一个问题是:如果我没有指定这个命令会发生什么?它总是会从本地存储库中获取过时的依赖项?如果不是,那为什么我需要这个命令?
3) 为了解决这样的问题,最好在编译代码时知道哪些 jars 真正在类路径上,以及在运行代码时哪些是存在的。Maven可以吗?