#typescript #spring-boot #kotlin-multiplatform
Вопрос:
Это сообщение с вопросами и ответами, которым я хотел бы поделиться. Если кто — нибудь предложит лучшее решение — я с радостью приму ответ.
Итак, недавно мне пришлось провести рефакторинг старого Java Maven
мультипроекта (Spring Boot, Data JPA, MVC, Freemarker, Swing, RMI и т. Д.) И решил разделить фронт/спину и переключиться на Gradle / Kotlin / Angular
.
- Первой проблемой, с которой я столкнулся, был переход от Maven к Gradle и поддержанию ограничений зависимостей, например, Maven просто использует
<parent>
спецификацию. - Во-вторых, нужно было применить
Spring Boot
зависимости кKotlin Multiplatform
модулю. - Третьим было создание
ts
определений модулей дляEntities
.
Ответ №1:
Для решения первой проблемы я нашел одно решение — составную сборку. Это означает создание в рамках проекта root Gradle нового модуля, который будет содержать ограничения зависимостей и будет построен как плагин, позже используемый в подпроектах. Этот проект должен быть добавлен settings.gradle
с includeBuild("build-conventions")
помощью команды. Как вы можете видеть, я назвал проект как "build-conventions"
, и он имеет следующую структуру папок :
build-conventionssrcmainConstraints.kt
import org.gradle.api.Plugin
import org.gradle.api.Project
class Constraints : Plugin<Project> {
override fun apply(prj: Project) {
prj.dependencies.constraints {
prj.configurations.filter { it.name.endsWith("implementation", true) }.forEach {
add(it.name, "org.springframework.boot:spring-boot-dependencies:2.5.4")
add(it.name, "MY.SOME:DEPENDENCY:1.3-SNAPSHOT")
add(it.name, "commons-beanutils:commons-beanutils:1.9.4")
add(it.name, "commons-io:commons-io:2.11.0")
add(it.name, "org.imgscalr:imgscalr-lib:4.2")
add(it.name, "org.glassfish:javax.el:3.0.1-b12")
add(it.name, "org.lz4:lz4-java:1.6.0")
}
}
}
}
build-conventionsbuild.gradle.kts
plugins {
`kotlin-dsl`
}
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
}
gradlePlugin {
plugins {
create("My Project Dependency Constraints") {
id = "dependencies-constraints"
implementationClass = "Constraints"
}
}
}
чтобы поддерживать версии плагинов в разных проектах, я нашел единственный способ объявить:
pluginManagement {
val kotlinVersion = "1.5.21"
val springBootVersion = "2.5.4"
val springBootDependencyVersion = "1.0.11.RELEASE"
plugins {
id("org.jetbrains.kotlin.jvm") version kotlinVersion apply false
id("org.jetbrains.kotlin.multiplatform") version kotlinVersion apply false
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply false
id("io.spring.dependency-management") version springBootDependencyVersion apply false
id("org.springframework.boot") version springBootVersion apply false
id("biz.lermitage.oga") version "1.1.0" apply false
}
}
в корне settings.gradle
Для достижения второй цели я добавил:
add(it.name, "org.springframework.boot:spring-boot-dependencies:2.5.4")
кConstraint.kt
зависимостям- плагин
id("dependencies-constraints")
к блоку мультиплатформенного модуля Kotlinplugins
- в мультиплатформенный Котлин
sourceSets
val jvmMain by getting {
dependencies {
implementation(project.dependencies.platform("org.springframework.boot:spring-boot-dependencies"))
implementation("MY.SOME:DEPENDENCY")
implementation("jakarta.persistence:jakarta.persistence-api")
implementation("jakarta.annotation:jakarta.annotation-api")
implementation("jakarta.validation:jakarta.validation-api")
implementation("org.springframework:spring-context")
implementation("com.fasterxml.jackson.core:jackson-annotations")
}
}
Для достижения третьей цели я использовал плагин Gradle для модуля Kotlin Multiplatfom (должна быть версия ниже или равна 1.5.21) . id("net.akehurst.kotlin.kt2ts") version "1.6.0"
https://github.com/dhakehurst/net.akehurst.kotlin.kt2ts