сбой зависимостей подпроектов с помощью Gradle

Я борюсь с Gradle и конфигурацией сборки следующей структуры проекта (довольно простой ...):

/projA
   /projB
   /projC

projC с использованием классов из projB.

В projA / settings.gradle:

include 'projB'
include 'projC'

В projC / build.gradle:

dependencies{
 compile project(':projB')
}

В IntelliJ у меня нет проблем с разрешением зависимостей, но когда я запускаю сборку ./gradlew в projA, я сталкиваюсь с ошибкой компиляции:

ClassC: Unresolved reference: ClassB

(где ClassC - это класс projC, который не работает при использовании ClassB, который, очевидно, является классом из projB ...)

Обратите внимание, что код написан на языке Kotlin, и у меня нет проблем с запуском приложения в IntelliJ (весенняя загрузка), но любая сборка с Gradle выдает ошибку (как в Intellij, так и в командной строке).

Что мне не хватает?

С уважением, Адриан


person AdZaf    schedule 04.05.2018    source источник


Ответы (1)


Распространенная идиома Gradle - иметь дополнительный каталог верхнего уровня для вашего rootProject. Это особый проект, являющийся родительским для всех других проектов в вашей сборке, в мульти- сборка проекта.

Вот куда идет ваш settings.gradle файл:

include ':projA:projB'
include ':projA:projC'

Затем я бы рекомендовал иметь projA в качестве подкаталога вашего rootProject, чтобы ваша иерархия выглядела следующим образом:

/myProject
  settings.gradle
  /projA
    build.gradle
    /projB
      build.gradle
    /projC
      build.gradle

Кроме того, в projC/build.gradle вместо этого вы захотите:

dependencies {
  compile project(':projA:projB')
}

Это должно сработать.

person Felipe Lima    schedule 04.05.2018
comment
Спасибо, Фелипе, оставаясь с моей первой иерархией проектов (projA как родитель для projB и projC), compile project(":projB") в build.gradle на моем projC не сработает? зачем мне добавлять дополнительный верхний уровень, если projA уже является проектом верхнего уровня, выступающим в качестве родительского проекта? - person AdZaf; 04.05.2018
comment
AFAIK Gradle захочет, чтобы вы предоставили полный путь к зависимостям вашего проекта, поэтому вам нужен ":projA:projB", думайте об этом как об относительном пути к каталогу. - person Felipe Lima; 04.05.2018