15

Jak wygląda poprawna konfiguracja Gradle w projekcie wielomodułowym, który korzysta z wtyczek Gradle spring-boot-dependencies i spring-boot?Wtyczka zależności Gradle w wielomodułowym projekcie Spring Boot

Mam następującą konfigurację projektu:

parent 
    | 
    + build.gradle 
    | 
    + alpha 
    | | 
    | + build.gradle 
    | 
    + beta 
    | | 
    | + build.gradle 
  • Moduł parent zawiera wspólną konfigurację projektu.
  • Moduł alpha to moduł, w którym chciałbym zaimportować zależności używając numerów wersji podanych w bom spring-boot-dependencies, ale wynikiem jest standardowy słoik.
  • Moduł beta jest modułem, który zależy od alpha, a wynikiem jest wykonywany plik jar Spring Boot (zawierający wszystkie zależności). W związku z tym projekt ten wymaga zarówno wtyczki spring-boot-dependencies, jak i wtyczki spring-boot.

Aby zachować pliki Gradle DRY, wyodrębniłem wspólne skrypty modułów do pliku rodzica build.gradle.

próbuje wykonać $ gradle build wykorzystując konfigurację projektu poniżej wyniki w:

> Plugin with id 'io.spring.dependency-management' not found. 

dominująca gradle.build

allprojects { 
    group = "com.example" 
    version '0.0.1-SNAPSHOT' 

    ext { 
     dependencyManagementPluginVersion = '0.5.3.RELEASE' 
     springBootVersion = '1.3.0.RC1' 
    } 

    apply plugin: 'java' 
    apply plugin: 'eclipse' 
    apply plugin: 'idea' 
} 

subprojects { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8 

    buildscript { 
     repositories { 
      jcenter() 
      maven { url "https://repo.spring.io/snapshot" } 
      maven { url "https://repo.spring.io/milestone" } 
     } 
     dependencies { 
      classpath("io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}") 
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
     } 
    } 

    apply plugin: 'io.spring.dependency-management' 

    dependencyManagement { 
     imports { 
      mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}") 
//   mavenBom("org.springframework.boot:spring-boot-starter-parent:${springBootVersion}") 
     } 
    } 
} 

alfa build.gradle

dependencies { 
    compile('org.springframework:spring-web') 
} 

beta gradle.build

apply plugin: 'spring-boot' 

dependencies { 
    compile project(':alpha') 
    compile('org.springframework.boot:spring-boot-starter') 
    compile('org.springframework.boot:spring-boot-starter-web') 
} 

Komentarze:

  • Zachowanie spring-boot wtyczki was changed w Spring Boot 1.3.0.M1
  • wersja Gradle: 2.8
  • Wiosna Boot version 1.3.0.RC1
+0

Jeśli moja odpowiedź była pomocna, należy ją odebrać. – Opal

+1

@Opal Przepraszam za opóźnienie, myślałem, że przyjąłem twoją odpowiedź. Napisałem [post na blogu] (http: //www.jayway.com/2015/11/23/reusing-spring-boots-dependency-management /) w tej sprawie, sprawdź potwierdzenia. :-) – matsev

+0

Dzięki, dokładnie ten problem, który miałem --- aby pomóc innym w googlowaniu tego problemu, dodam: Jeśli naiwnie spróbujesz: zastosuj plugin 'spring-boot' do WSZYSTKICH twoich podprojektów, (tylko w celu uzyskania zależności od wiosny -management za darmo) otrzymasz błąd kompilacji (przynajmniej dostałem się pod oknami), jak: Wykonanie nie powiodło się dla zadania ": xxxxx: bootRepackage". Nie można zmienić nazwy "xxxxx.jar" na "xxxxx.jar.original" – Rop

Odpowiedz

16

Okazuje się, że parent/build.gradle należy uporządkowane w następujący sposób:

buildscript { 
    ext { 
     dependencyManagementPluginVersion = '0.5.3.RELEASE' 
     springBootVersion = '1.3.0.RC1' 
    } 
    repositories { 
     jcenter() 
     maven { url "https://repo.spring.io/snapshot" } 
     maven { url "https://repo.spring.io/milestone" } 
    } 
    dependencies { 
     classpath("io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}") 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    } 
} 

allprojects { 
    group = "com.example" 
    version '0.0.1-SNAPSHOT' 

    apply plugin: 'java' 
    apply plugin: 'eclipse' 
    apply plugin: 'idea' 
} 

subprojects { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8 

    apply plugin: 'io.spring.dependency-management' 

    dependencyManagement { 
     imports { 
      mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}") 
//   mavenBom("org.springframework.boot:spring-boot-starter-parent:${springBootVersion}") 
     } 
    } 
} 

Problem polega na tym, że buildscript blok dla podprojektów rzeczywiście skonfigurowany dobrze, ale. .. w niewłaściwym miejscu. Ten blok subprojects dotyczy podprojektów, ale zostanie poddany ocenie w skrypcie, który został zadeklarowany, i nie było zadeklarowanych zależności dla wtyczki, którą próbował zastosować.

+1

Dzięki, ale to nie działa. Teraz Gradle nie może znaleźć repozytoriów dla submodułów: '> Nie można rozwiązać zależności zewnętrznej org.springframework.boot: spring-boot-dependencies: 1.3.0.RC1, ponieważ nie zdefiniowano repozytoriów. Wymagane przez: com.przykład: alpha: 0.0.1-SNAPSHOT' Kopiowanie 'repozytoriów' do' allprojects' rozwiązuje problem, ale czy istnieje sposób na zdefiniowanie 'repozytoriów' _once_, aby był dostępny z obu 'buildscript' i' allprojects'? – matsev

+0

Nie:/Niestety są to oddzielne konfiguracje. To musi być duplikowane. – Opal