Мой проект Gradle зависит от commons-io 2.4, но Gradle помещает $GRADLE_HOME/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. Затем я проверил код в банке 1.4 и определил, что класс «FileUtils» в этой версии не имеет метода «записи».

Что мне с этим делать?

Обновление:

Я полагаю, что мой блок «зависимости», вероятно, был бы полезен, а именно:

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», но это также не имело никакого значения. }


person David M. Karr    schedule 31.03.2015    source источник


Ответы (2)


Вероятно, вы добавили gradleApi() в блок dependencies {} — см. документы. Проблема в том, что он поставляет все зависимости, которые требует gradle, включая commons-io в версии 1.4 — см. отрывок ниже:

[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().

person Opal    schedule 31.03.2015
comment
Как я отметил в обновлении, которое я сделал одновременно с вашим ответом, я подумал, что проблема может быть в этом, но когда я прокомментировал это, это не имело значения. - person David M. Karr; 31.03.2015
comment
И на всякий случай я попытался сделать зависимости gradle, чтобы увидеть, есть ли какие-либо другие неожиданные ссылки на commons-io 1.4, и их не было, только моя единственная ссылка на 2.4. - person David M. Karr; 31.03.2015
comment
Возможно кешируется - попробуйте удалить папку .gradle. Вероятно, вы не предоставите плагин без gradleApi(). Смотрите обновленный ответ. - person Opal; 31.03.2015
comment
@DavidM.Karr - звучит очень странно. Он должен быть где-то закэширован. Это не работает с командной строкой и затмением? - person Opal; 31.03.2015
comment
Сбой только в командной строке. Eclipse не показывает красных меток. - person David M. Karr; 31.03.2015
comment
Хорошо, и теперь у вас есть обе версии commons-io в пути к классам? - person Opal; 31.03.2015
comment
Правильно, и обратите внимание, что ссылка на 1.4 в пути к классам не из моего кеша, а из каталога дистрибутива Gradle. - person David M. Karr; 31.03.2015
comment
Давайте продолжим обсуждение в чате. - person Opal; 31.03.2015

Решение этой проблемы потребовало добавления следующего блока в блок «sourceSets»:

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

Это довольно просто, но я бы хотел, чтобы для этого было более чистое решение. Я не уверен, как это будет выглядеть.

person David M. Karr    schedule 02.04.2015