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