【问题标题】: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 2.4,但是Gradle把$GRADLE_HOME/commons-io-1.4.jar放到classpath中,导致失败
【发布时间】:2015-03-31 20:03:07
【问题描述】:

我一直在迭代我的第一个 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”引用,但没有效果。我还尝试为与“groovy-all”引用关联的 commons-io 添加“排除”,但这似乎也没有任何区别。 }

【问题讨论】:

    标签: groovy gradle apache-commons-io


    【解决方案1】:

    您可能在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() 中排除传递依赖。

    【讨论】:

    • 正如我在与您的回答同时进行的更新中指出的那样,我认为这可能是问题所在,但是当我将其注释掉时,它没有任何区别。
    • 它可能已被缓存 - 尝试删除 .gradle 文件夹。如果没有gradleApi(),您可能不会提供插件。查看更新的答案。
    • @DavidM.Karr - 听起来很奇怪。它必须缓存在某个地方。命令行和eclipse会失败吗?
    • 它只是在命令行上失败。 Eclipse 没有显示红色标记。
    【解决方案2】:

    解决方案需要在“sourceSets”块中添加以下块:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 2018-06-23
      • 2012-07-21
      • 2016-12-06
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多