Платформа зависимостей Gradle в родительском модуле

#java #gradle #platform

#java #gradle #Платформа

Вопрос:

У меня есть проект gradle с большим количеством подпроектов, и я хочу, чтобы файл спецификации применялся ко всем подпроектам. Я попытался поместить это в какой-то подпроект, и он работает нормально:

 dependencies{
  implementation enforcedPlatform('group:bom-artifact:version')
}
  

Но когда я ставлю его родителем gradle.build или оборачиваю его как:

 allprojects {
    dependencies {
        implementation enforcedPlatform('group:bom-artifact:version')
    }
}
  

Это заканчивается ошибкой:

 > Could not find method implementation() for arguments [DefaultExternalModuleDependency{group='group', name='bom-artifact', version='version', configuration='default'}] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
  

Не могу понять, что не так. Как это исправить? Или есть лучший способ применить одну спецификацию ко всем подпроектам и управлять ею из одного места?

Ответ №1:

Я не думаю, что проблема здесь в самой платформе

Сообщение, которое вы получаете, обычно появляется, если вы (еще) не применили плагин Java.

Области конфигурации Gradle, такие как implementation, api и compileOnly, инициализируются как часть фазы инициализации плагина Java.

Таким образом, в зависимости от структуры вашего подпроекта у вас может быть один или несколько подпроектов, которые не используют плагин Java, который не определяет область действия. Я не совсем уверен в порядке выполнения между подпроектами, это может сыграть свою роль.

Простым решением было бы применить плагин также к закрытию allprojects, например

 allprojects {
    apply plugin: 'java'
    dependencies {
        implementation enforcedPlatform('group:bom-artifact:version')
    }
}