У меня есть структура сборки с несколькими проектами, и весенняя загрузка применяется от родителя ко всем подпроектам. Вот родительский build.gradle
buildscript {
repositories {
maven {
url 'http://someurl.com/repository/MavenRepositoryGroup/'
}
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.5.8.RELEASE"
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'eclipse'
apply plugin: 'war'
apply plugin: 'org.springframework.boot'
..
..
..
}
}
Среди множества подпроектов у меня есть требование обновить только подпроект один до версии Spring boot 2. Как это сделать?
возможно, вы сможете найти ответ или идеи из этого вопроса на форуме gradle: обсуждение.gradle.org/t/…




Это довольно просто, просто объявите плагины напрямую в подпроектах, где они используются. Кстати, подумайте об использовании новый plugins DSL вместо apply. Взгляните на демонстрационный проект, который я создал для вас. Вот самые интересные части:
settings.gradle:
rootProject.name = "so53381565"
enableFeaturePreview("IMPROVED_POM_SUPPORT")
include(":a")
include(":b")
include(":c")
build.gradle:
subprojects {
apply plugin: "java"
repositories {
jcenter()
}
}
wrapper {
gradleVersion = "4.10.2"
distributionType = Wrapper.DistributionType.ALL
}
а / build.gradle:
plugins {
id "org.springframework.boot" version "1.5.8.RELEASE"
}
dependencies {
implementation "org.springframework.boot:spring-boot-starter"
}
б / build.gradle:
plugins {
id "org.springframework.boot" version "1.5.17.RELEASE"
}
dependencies {
implementation "org.springframework.boot:spring-boot-starter"
}
c / build.gradle:
plugins {
id "org.springframework.boot" version "2.0.6.RELEASE"
}
dependencies {
implementation "org.springframework.boot:spring-boot-dependencies:2.0.6.RELEASE"
implementation "org.springframework.boot:spring-boot-starter"
}
App.java:
@SpringBootApplication
public class App implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println(SpringVersion.getVersion());
}
}
App.java одинаков во всех трех подпроектах. Выполнение ./gradlew clean :a:bootRun :b:bootRun :c:bootRun выдаст что-то вроде:
…
4.3.12.RELEASE
…
4.3.20.RELEASE
…
5.0.10.RELEASE
…
Как видите, вы используете три разных источника в трех разных подпроектах.
РЕДАКТИРОВАТЬ
Во-первых, вы все еще можете использовать apply, просто поместите их в подпроекты.
Во-вторых, вы можете использовать plugins со своими собственными репозиториями и зависимостями, даже с теми, которые не опубликованы в репозитории плагинов Gradle добавлением, блоке pluginManagement в settings.gradle (это Kotlin DSL из моего проекта):
pluginManagement {
repositories {
gradlePluginPortal()
add(jcenter())
add(maven("http://my.jfrog.io"))
}
resolutionStrategy {
eachPlugin {
if (requested.id.id == "by.dev.madhead.some-plugin") {
useModule("by.dev.madhead:some-gradle-plugin:${requested.version}")
}
}
}
}
Теперь я могу использовать by.dev.madhead.some-plugin в plugins DSL в рамках всего проекта:
plugins {
id("by.dev.madhead.some-plugin").version("42")
}
И он будет заменен на by.dev.madhead:some-gradle-plugin:42
Это здорово, но я включил плагин старого стиля в том, что я должен определить свои собственные серверы нексуса, а не общедоступный, если вы заметили. Есть ли способ определить такие прокси-серверы в новом плагине DSL?
Вы можете опубликовать, где вы управляете своей версией, я имею в виду ext {}