我的 Gradle 项目依赖于 commons-io 2.4,但是 Gradle 将 $GRADLE_HOME/commons-io-1.4.jar 放入类路径,导致失败

My Gradle project depends on commons-io 2.4, but Gradle puts $GRADLE_HOME/commons-io-1.4.jar into the classpath, causing failures

我一直在迭代我的第一个 Gradle 插件中的功能。我很早就确定我需要 commons-io,所以我添加了对 commons-io 2.4 的依赖,这是最新版本。

这一段时间以来一直很顺利,构建从命令行运行,并且在 Eclipse 中没有错误。

我刚开始尝试集成一些使用 "FileUtils.write(File,String)" 的代码。我以前不需要那个方法。我在 Eclipse 中得到了所有未修改的内容,然后我尝试了命令行构建。

失败并出现如下错误:

    ... error: cannot find symbol
                FileUtils.write(serviceLoaderFile,
                         ^
  symbol:   method write(File,String)
  location: class FileUtils

这让我很困惑。我去了 Eclipse 中的失败行,没有指出任何问题。我导航到 "write()" 方法,它看起来不错。然后,我 运行 使用“--debug”构建我的命令行以获取一些线索。

当我找到 "javac" 行时,我发现“$GRADLE_HOME\lib\commons-io-1.4.jar”(其中 "GRADLE_HOME" 只是我的 Gradle 2.3 发行版) 在我的依赖 jar 之前的 class 路径中。然后我检查了 1.4 jar 中的代码,我确定该版本中的 "FileUtils" class 没有 "write" 方法。

我该怎么办?

更新:

我想我的 "dependencies" 块可能会有用,就是这个:

dependencies {
  compile ("org.codehaus.groovy:groovy-all:2.3.9")
  compile gradleApi()
  compile "org.opendaylight.yangtools:yang-parser-impl:0.7.0-SNAPSHOT"
  compile "org.opendaylight.yangtools:binding-java-api-generator:0.7.0-SNAPSHOT"
  compile "org.opendaylight.yangtools:binding-generator-api:0.7.0-SNAPSHOT"
  compile "org.opendaylight.yangtools:binding-generator-impl:0.7.0-SNAPSHOT"
  compile "org.opendaylight.controller:yang-jmx-generator:0.3.0-SNAPSHOT"
  compile "commons-io:commons-io:2.4"

  testCompile("org.spockframework:spock-core:1.0-groovy-2.3") {
    exclude group: "org.codehaus.groovy"
  }

我尝试注释掉 "gradleApi" 参考,但没有效果。我还尝试为与 "groovy-all" 引用关联的 commons-io 添加一个 "exclude",但这似乎也没有任何区别。 }

您可能在 dependencies {} 块下添加了 gradleApi() - 请参阅 docs。问题是它提供了 gradle 需要的所有依赖项 - 包括 1.4 版本中的 commons-io - 请参阅下面的摘录:

[opal@opal-mac-2]~/.gvm/gradle/current/lib % pwd
/Users/opal/.gvm/gradle/current/lib
[opal@opal-mac-2]~/.gvm/gradle/current/lib % ll commons-io-1.4.jar 
-rw-rw-r--  1 opal  staff  109043 23 gru 13:17 commons-io-1.4.jar
[opal@opal-mac-2]~/.gvm/gradle/current/lib % 

您可能单独添加了版本2.4,这就是发生冲突的原因。您也可以 运行

gradle dependencies

查看完整的依赖关系树并验证问题。

无法从 gradleApi() 中排除传递依赖。

此问题的解决方案需要将以下块添加到 "sourceSets" 块:

main {
    compileClasspath = configurations.compile.minus files("$gradle.gradleHomeDir/lib/commons-io-1.4.jar")
}

这很简单,但我希望有一个更简洁的解决方案。我不确定那会是什么样子。