Spring Загрузка проекта с несколькими модулями с Gradle не создает

Я работаю над приложением Spring для загрузки с несколькими модулями, и мы используем Gradle для его создания. К сожалению, я не могу получить конфигурацию Gradle.

Структура проекта такова:

parent
  |
  + build.gradle
  |
  + settings.gradle
  |
  + core
  |   |
  |   + build.gradle
  | 
  + apis
  |   |
  |   + build.gradle
  |
  + services
  |   |
  |   + build.gradle
  | 
  + data
  |   |
  |   + build.gradle

Когда я пытаюсь построить проект, я получаю ошибки компиляции, такие как error: cannot find symbol, говорящие, что классы из данных, используемых в сервисах, не импортируются. И я предполагаю, что это верно для всех модулей.

Мой родительский build.gradle выглядит так:

buildscript {
    ext {
        springBootVersion = '2.0.0.BUILD-SNAPSHOT'
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'eclipse'
apply plugin: 'idea'

allprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    group = 'com.example'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }

    dependencies {
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
}

dependencies {
    compile project(':data')
    compile project(':services')
    compile project(':apis')
    compile project(':core')
}

jar {
    baseName = 'my-jar'
    version = '0.0.1-SNAPSHOT'
}

settings.gradle:

rootProject.name = 'my-app'
include ':apis'
include ':core'
include ':data'
include ':services'

у одного из детей (ядро) есть это в файле build.gradle:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-quartz')
    compile('org.springframework.boot:spring-boot-starter-tomcat')
    runtime('com.h2database:h2')

    compile project(':data')
    compile project(':services')
    compile project(':apis')
}

services build.gradle выглядит следующим образом:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-quartz')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    runtime('com.h2database:h2')

    compile project(':data')
}

Другие также объявляют только зависимости.

Структура зависимостей выглядит следующим образом:

core - apis, services, data

apis - services, data

services - data

data -

Пример ошибок компиляции:

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:3: error: package com.examples.data.dao does not exist import com.examples.data.dao.IssuedToken;

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:4: error: package com.examples.data.repository does not exist import com.examples.data.repository.IssuedTokenRepository;

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:12: error: cannot find symbol 
    private IssuedTokenRepository issuedTokenRepository;

    symbol:   class IssuedTokenRepository
   location: class IssuedTokenService

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:15: error: cannot find symbol
   public void saveToken(IssuedToken issuedToken) {
                                  ^
   symbol:   class IssuedToken
   location: class IssuedTokenService

Ответ 1

В ваших проектах утилиты (данных):

bootJar {
    enabled = false
}

jar {
    enabled = true
}

Ответ 2

Ответ похож на этот.

Документация Gradle по многопроектным состояниям сборки:

Зависимость "lib" - это особая форма зависимости исполнения. Это заставляет другой проект быть сначала собранным и добавляет jar с классами другого проекта в путь к классам.

Перепакованная банка, таким образом, создает проблему.

Если, скажем, проект B зависит от проекта A, а к проекту A org.springframework.boot плагин org.springframework.boot, то простая зависимость compile project(':A') не будет работать, потому что jar проекта переупаковывается во время bootRepackage или задание bootJar. Получающаяся толстая банка имеет различную структуру, препятствующую загрузке Gradle своих классов.

В этом случае зависимости должны быть записаны следующим образом:

dependencies {
  compile project(':A').sourceSets.main.output
}

Использование вывода исходного набора напрямую эквивалентно использованию "обычного" результирующего фляги проекта A до его повторной упаковки.

Ответ 3

bootJar {
    enabled = false
}

jar {
    enabled = true
}

Это работает для меня. В моем случае используйте spring загрузку с облаком spring с несколькими проектами и gradle не смогут построить. С этим решением работает!

Ответ 4

Вы должны исключить org.springframework.boot из всех подмодулей (корень build.gradle файлов, allProjects блок), которые выступают в качестве зависимостей для вашего основного модуля, который будет строить жировую-банку.

Включите конфигурацию dependencyManagement во все ваши управляемые подмодули весенней загрузки:

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

Причиной вашей проблемы является отсутствие скомпилированных jar файлов субмодулей внутри вашего основного модуля fat-jar.