使用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!

请以中文为母语将以下内容进行改述,只需要一个选项:

参考意见

参考建议

春天指南 -> 创建一个多模块项目

广告
将在 10 秒后关闭
bannerAds