web-dev-qa-db-ja.com

Gradleを使用したSpring Bootマルチモジュールプロジェクトがビルドされない

私は複数のモジュールを備えたSpring Bootアプリに取り組んでおり、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'

子(コア)の1つが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')
}

サービス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
17
bajermi2

ユーティリティ(データ)プロジェクトに以下を入力します。

bootJar {
    enabled = false
}

jar {
    enabled = true
}
34
Prime

答えは this one に似ています。

Gradle ドキュメント マルチプロジェクトのビルド状態:

「lib」依存関係は、実行依存関係の特別な形式です。これにより、他のプロジェクトが最初にビルドされ、他のプロジェクトのクラスを含むjarがクラスパスに追加されます。

したがって、再パッケージ化されたjarには問題があります。

たとえば、プロジェクトBがプロジェクトAに依存しており、プロジェクトAorg.springframework.bootプラグインが適用されている場合、単純なcompile project(':A')プロジェクトjarはbootRepackageまたはbootJarタスク中に再パッケージ化されるため、依存関係は機能しません。生成されるファットjarの構造は異なり、Gradleがそのクラスをロードできません。

この場合、依存関係は次のように記述する必要があります。

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

ソースセットの出力を直接使用することは、プロジェクトAの「通常の」結果jarを再パッケージ化する前に使用することと同等です。

10
jihor

すべてのサブモジュール(ルートorg.springframework.bootファイル、allProjectsブロック)からbuild.gradleを除外する必要があります。これらは、fat-jarにビルドされるコアモジュールの依存関係です。

dependencyManagement構成をすべてのスプリングブート管理サブモジュールに含めます。

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

問題の原因は、コアモジュールfat-jar内にサブモジュールコンパイルされたjarファイルがないことです。

1
Alexandr Solo
bootJar {
    enabled = false
}

jar {
    enabled = true
}

これは私の仕事です。私の場合、マルチプロジェクトとgradleがビルドに失敗したSpring CloudでSpring Bootを使用してください。このソリューションで動作します!

1
dariovmartine