我的 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")
}
这很简单,但我希望有一个更简洁的解决方案。我不确定那会是什么样子。
我一直在迭代我的第一个 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")
}
这很简单,但我希望有一个更简洁的解决方案。我不确定那会是什么样子。