我的Gradle项目依赖于commons io 2.4,但Gradle将$Gradle_HOME/commons-io-



我一直在迭代我的第一个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之前的类路径中。然后我检查了1.4 jar中的代码,确定该版本中的"FileUtils"类没有"write"方法。

我该怎么办?

更新

我想我的"依赖项"块可能会很有用,这就是:

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"的引用,但没有效果。我还尝试为commons-io添加一个与"groovy-all"引用相关的"exclude",但这似乎也没有任何区别。}

您可能在dependencies {}块下添加了gradleApi(),请参阅文档。问题是,它提供了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")
}

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

最新更新