Я пытаюсь экспериментально перенести java-проект MAVEN на gradle. Одна из проблем, с которой я столкнулся, — это невозможность выполнить модульные тесты из-за ошибки NoSuchMethodError, возникающей во время выполнения (во время выполнения). Я вызываю метод FileUtils.write()
.
Я изменил свой код, чтобы отследить путь к классу, доступный в ClassLoader, который загрузил класс FileUtils, и у меня есть следующее:
C:/Sdk/gradle-2-7/lib/commons-io-1.4.jar
C:/Users/<me>/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar
Из этого я вижу, что во время тестового запуска в пути к классам есть 2 версии commons-io, и та, которая идет с gradle, является первой и, следовательно, имеет более высокий приоритет.
Какова основная причина? Как это можно исправить?
На самом деле, я ожидаю, что никакие JAR-файлы не будут доступны в пути к классам, кроме явно объявленных в зависимостях моего проекта gradle.
Обновление: кажется, у меня есть представление о первопричине - тестируемый проект является «плагином gradle», и чтобы скомпилировать его в gradle, я должен указать следующее в build.gradle
:
dependencies {
compile gradleApi()
}
И это просачивается, чтобы захватить все зависимости gradle в мой проект. Хотя я до сих пор не вижу способа исправить это:
- Я не могу удалить его, потому что проект не компилируется
- Я не могу что-то исключить, потому что gradle не поддерживает это для
gradleApi()
(см. http://gradle.1045684.n5.nabble.com/exclude-some-dependencies-from-gradleApi-dependency-td5712103.html). - Я не могу добавить только те gradle jar, которые мне действительно нужны, в качестве зависимостей - я не вижу способа явно ссылаться на них в зависимостях компиляции, я не вижу общедоступного репозитория, содержащего эти артефакты. Примечание: для сборки MAVEN я вручную загрузил их в локальный репозиторий MAVEN.