我试图通过实验将一个MAVEN java项目移植到gradle。我遇到的其中一个问题是由于NoSuchMethodError在运行时(执行期间)发生而未能执行单元测试。我打电话给FileUtils.write()
方法。NoSuchMethodError在测试下运行gradle
我修改代码来跟踪在加载文件实用程序类的类加载器提供类路径和我有以下几点:
C:/Sdk/gradle-2-7/lib/commons-io-1.4.jar
C:/Users/<me>/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar
出的,我看到有2个版本的commons-IO的在测试运行期间的类路径和来自Gradle的类路径是第一个,因此具有更高的优先级。
根本原因是什么?这可以如何解决?
实际上,我希望除了我的gradle项目的依赖关系中明确声明的classpath之外,没有JAR可用。
更新:看来,我已经得到了有关的根本原因的想法 - 被测试的项目是“gradle这个插件”,并编译它的gradle中我有build.gradle
到指定以下内容:
dependencies {
compile gradleApi()
}
这渗透到我的项目捕获所有gradle依赖项。虽然我还没有看到的方式来解决这个问题:
- 我无法将其删除,因为该项目不会编译
- 我不能排除一些事情,因为gradle这个不支持此为
gradleApi()
(见http://gradle.1045684.n5.nabble.com/exclude-some-dependencies-from-gradleApi-dependency-td5712103.html) 。 - 我不能只添加那些我真正需要的gradle jar作为依赖关系 - 我没有看到任何方式在编译依赖关系中明确引用它们,我没有看到任何包含这些工件的公共存储库。注意:对于MAVEN构建,我已手动将它们上载到本地MAVEN库中。
是您试图使用FileUtils.write但旧版本(1.4)没有该方法(类'碰撞')的问题? – Ethan
这是发生的问题,但根问题稍有不同 - 我在插件中引用的库使用commons-io的较新版本,而gradle提供的运行时提供较旧的版本。所以...... gradle应该在测试时以某种方式提供ClassLoaders的分离,让“自己的代码”和“单元测试下的插件代码”与不同版本的第三方库共存。 –
Gradle在这里做着正确的事情,保护您免受不正确的测试。当你的插件被加载时,它会运行到你的测试看到的相同的jar错过匹配。我会尝试使用Java8或Groovy来解决需要这个库。 – Ethan