私は複数のモジュールを備えた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
ユーティリティ(データ)プロジェクトに以下を入力します。
bootJar {
enabled = false
}
jar {
enabled = true
}
答えは this one に似ています。
Gradle ドキュメント マルチプロジェクトのビルド状態:
「lib」依存関係は、実行依存関係の特別な形式です。これにより、他のプロジェクトが最初にビルドされ、他のプロジェクトのクラスを含むjarがクラスパスに追加されます。
したがって、再パッケージ化されたjarには問題があります。
たとえば、プロジェクトB
がプロジェクトA
に依存しており、プロジェクトA
にorg.springframework.boot
プラグインが適用されている場合、単純なcompile project(':A')
プロジェクトjarはbootRepackage
またはbootJar
タスク中に再パッケージ化されるため、依存関係は機能しません。生成されるファットjarの構造は異なり、Gradleがそのクラスをロードできません。
この場合、依存関係は次のように記述する必要があります。
dependencies {
compile project(':A').sourceSets.main.output
}
ソースセットの出力を直接使用することは、プロジェクトA
の「通常の」結果jarを再パッケージ化する前に使用することと同等です。
すべてのサブモジュール(ルートorg.springframework.boot
ファイル、allProjects
ブロック)からbuild.gradle
を除外する必要があります。これらは、fat-jarにビルドされるコアモジュールの依存関係です。
dependencyManagement
構成をすべてのスプリングブート管理サブモジュールに含めます。
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}"
}
}
問題の原因は、コアモジュールfat-jar内にサブモジュールコンパイルされたjarファイルがないことです。
bootJar {
enabled = false
}
jar {
enabled = true
}
これは私の仕事です。私の場合、マルチプロジェクトとgradleがビルドに失敗したSpring CloudでSpring Bootを使用してください。このソリューションで動作します!