如果想要将现有的Spring Boot转为多模块,
这次需要做的事情
我想要将已存在的Spring Boot项目改造为多模块管理的形式。
-
- root モジュールには、kotlinなどの言語・フレームワークを管理
- サブモジュール別でライブラリ等を自分で管理できるようにする
最终目标
-
- サブモジュールで Bootrun できる
API 実行後、指定の返り値が返ってくること
请注意
-
- 意味や解釈を間違えている可能性があります・・・?(調べてから記載はしてはいるのですが・・・)
ご指摘していただけるとありがたいです
前提
- すでに spring initializr で 作成後、bootRun で起動ができる
. (rootモジュール)
| - build.gradle.kts
| - settings.gradle.kts
| - src...
ライブラリバージョンspring boot2.5.13kotlin1.5.32Gradle7.4.1
实践
请确认根目录下的 “build.gradle.kts” 文件。
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.5.13"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.5.32"
kotlin("plugin.spring") version "1.5.32"
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "11"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
2. 创建用于多模块化的基础结构(子模块名称为「sample-todo」)。
创建一个新的模块和 build.gradle.kts 文件。
. (rootモジュール)
| - build.gradle.kts
| - settings.gradle.kts
| - sample-todo // 新しく作成
| - build.gradle.kts // 新しく作成
在root模块的”build.gradle.kts”文件中写下2 – 2的内容。
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.5.13"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.5.32"
kotlin("plugin.spring") version "1.5.32"
}
// 全てのモジュールに対して適用する依存関係等を指定することができる
allprojects {
group = "com.example"
version = "0.0.1-SNAPSHOT"
// 依存関係を取得することができる?
// これがないと、起動できない
repositories {
mavenCentral()
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "11"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
}
// サブモジュールで使用する共通の依存関係を指定できる
subprojects {
apply {
plugin("java")
plugin("kotlin")
plugin("io.spring.dependency-management")
plugin("org.jetbrains.kotlin.jvm")
plugin("org.jetbrains.kotlin.plugin.spring")
}
java.sourceCompatibility = JavaVersion.VERSION_11
dependencies {
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
}
在root模块的”settings.gradle.kts”文件中记录。
rootProject.name = "root モジュール名"
include("sample-todo") // <- サブモジュールを追加
2-4. 在 “build.gradle.kts” 文件中的 sample-todo 模块中进行记录。
// Spring bootを導入する
plugins {
id("org.springframework.boot")
}
// web サービスを使う上での最低限の依存関係を入れる
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
将其转化为相应的中文语句:
2 – 5. 创建如下所示的目录结构。
sample-todo
├── build.gradle.kts
└── src
├── main
│ └── kotlin
│ └── com
│ └── example
│ └── sampleTodo
│ └── SampleTodoApplication.kt
└── test
└── kotlin
将SampleTodoApplication.kt以如下方式进行编写
package com.example.sampleTodo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class SampleTodoApplication
fun main(args: Array<String>) {
runApplication<SampleTodoApplication>(*args)
}
尝试执行「Bootrun」(仅启动,其他功能不可用)。
删除root模块中”src”文件夹下的所有子目录。
. root モジュール
└── src(ここから下のファイルは削除して良い)
├── main
│ ├── kotlin
│ │ └── com
│ │ └── example
│ │ └── ...
│ └── resources
└── test
└── kotlin
└── com
└── ....
3. API的创建和执行
src
├── main
│ └── kotlin
│ └── com
│ └── example
│ └── sampleTodo
│ ├── SampleTodoApplication.kt
│ └── controller
│ └── SampleController.kt (新しく作成)
└── test
└── kotlin
package com.example.sampleTodo.controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class SampleController(){
@GetMapping
fun get(): String {
return "OK"
}
}
如果使用能够调用 API 的工具或命令进行执行,并显示以下值,则结束。
-
- HTTPステータス「200」
- 「OK」の文字列が表示される
还有其他的人。。。
如果想要使用与根模块指定版本不同的版本
在根模块的 “build.gradle.kts” 中进行了记录。
plugins {
id("org.springframework.boot") version "2.4.5" apply false
}
通过添加false来声明”此插件不适用于rootProjects”
请提供相关的参考资料。
-
- https://kazamori.jp/blogs/2020/06/30/gradle-multi-project/
-
- https://it-blue-collar-dairy.com/springboot_multi-project_sample/
-
- https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:dependencies_which_dependencies
-
- https://qiita.com/BooookStore/items/695b199a5d13f633a2dc
- https://qiita.com/k-okajima/items/ca29e2956a03c5768747