Мультиплатформенные объекты совместного использования Kotlin между внешним и внутренним интерфейсом с ограничениями на зависимости

#typescript #spring-boot #kotlin-multiplatform

Вопрос:

Это сообщение с вопросами и ответами, которым я хотел бы поделиться. Если кто — нибудь предложит лучшее решение — я с радостью приму ответ.
Итак, недавно мне пришлось провести рефакторинг старого Java Maven мультипроекта (Spring Boot, Data JPA, MVC, Freemarker, Swing, RMI и т. Д.) И решил разделить фронт/спину и переключиться на Gradle / Kotlin / Angular .

  1. Первой проблемой, с которой я столкнулся, был переход от Maven к Gradle и поддержанию ограничений зависимостей, например, Maven просто использует <parent> спецификацию.
  2. Во-вторых, нужно было применить Spring Boot зависимости к Kotlin Multiplatform модулю.
  3. Третьим было создание 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

Для достижения второй цели я добавил:

  1. add(it.name, "org.springframework.boot:spring-boot-dependencies:2.5.4") к Constraint.kt зависимостям
  2. плагин id("dependencies-constraints") к блоку мультиплатформенного модуля Kotlin plugins
  3. в мультиплатформенный Котлин 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