使用Kotlin编写SpringBoot的多项目
这是使用Kotlin+SpringBoot进行多项目开发的方法。
我使用的方法是将演示层与后续层分开,通过多项目实现,在例如Web应用程序和操作事件的应用程序(如Kafka)之间重用相同的领域知识。
创建多个项目 duō gè
这是本次的目录结构。
.(Root)
├── share (共通ライブラリとして利用するプロジェクト)
│ ├── src/main/kotlin
│ │ └── com.example.demo.service
│ │ └── HelloService.kt
│ └── build.gradle
├── web (アプリケーションプロジェクト)
│ ├── src/main
│ │ ├── kotlin
│ │ │ └── com.example.demo
│ │ │ ├── DemoApplication.kt
│ │ │ └── controller
│ │ │ └── HelloController.kt
│ │ └── resources
│ │ └── application.yml
│ └── build.gradle
├── build.gradle
└── setting.gradle
更改 setting.gradle
如果要将项目设置为多项目,则需要在setting.gradle文件中进行设置。
在include中指定一个子项目。
rootProject.name = 'demo'
include 'web', 'share'
修改 build.gradle。
首先我们要修改项目根目录下的build.gradle文件。
plugins {
id "org.springframework.boot" version "2.2.6.RELEASE"
id "io.spring.dependency-management" version "1.0.9.RELEASE"
id "org.jetbrains.kotlin.jvm" version "1.3.71"
id "org.jetbrains.kotlin.plugin.spring" version "1.3.71"
}
ext {
springBootVersion = "2.2.6.RELEASE"
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11
allprojects {
repositories {
mavenCentral()
}
}
subprojects {
apply plugin: 'kotlin'
apply plugin: 'org.springframework.boot'
apply plugin: "io.spring.dependency-management"
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:$springBootVersion"
}
}
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") {
exclude group: "org.junit.vintage", module: "junit-vintage-engine"
}
}
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions {
freeCompilerArgs = ['-Xjsr305=strict']
jvmTarget = '11'
}
}
compileTestKotlin {
kotlinOptions {
freeCompilerArgs = ['-Xjsr305=strict']
jvmTarget = '11'
}
}
}
网络项目
网页项目的角色设定为演示层,例如控制器等。
构建.gradle文件
web项目的build.gradle文件。
请注意,在Kotlin中,mainClass的命名方式是类名+Kt。
bootJar {
mainClassName = "com.example.demo.DemoApplicationKt"
}
dependencies {
implementation project(":share")
}
翻译:代码
package com.example.demo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
open class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
package com.example.demo.controller
import com.example.demo.service.HelloService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController("/")
class HelloController(
private val helloService: HelloService
) {
@GetMapping()
fun getHello(): String {
return helloService.say()
}
}
请将其他的application.properties(yams)文件放置在这个项目中。
这次没有特别的备注。
分享项目
分享项目被设想为作为服务等领域知识的分配层的角色。
创建.gradle文件
在share项目的build.gradle中,我进行了以下设置。
share项目被视为库,并不作为独立可执行应用程序,因此我禁用了bootJar,启用了jar。
如果需要使用其他外部库或者其他东西,可以将其添加到依赖项中。
bootJar {
enabled = false
}
jar {
enabled = true
}
dependencies {
}
代码
package com.example.demo.service
import org.springframework.stereotype.Service
@Service
class HelloService {
fun say(): String {
return "Hello!"
}
}
编译和运行
然后进行构建并运行。
$ gradle :web:build
Starting a Gradle Daemon (subsequent builds will be faster)
<-------------> 0% CONFIGURING [14s]
BUILD SUCCESSFUL in 1m 28s
7 actionable tasks: 7 executed
$ ls -l web/build/libs/
total 43296
-rw-r--r-- 1 ysaito staff 22167040 5 2 22:31 web.jar
$ java -jar web/build/libs/web.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.6.RELEASE)
--一部省略--
2020-05-02 22:33:08.984 INFO 1825 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
$ curl localhost:8080/
Hello!
请以中文为母语将以下内容进行改述,只需要一个选项:
参考意见
参考建议
春天指南 -> 创建一个多模块项目