为艺术而技术

Kotlin Vertx React 1

September 22, 2019

如同上文所说,我也一直想尝试基于共享代码的web编程,之前尝试过Scala平台的。刚刚发现Kotlin自从1.2开始也支持了,于是也想尝试以下。

另外如同上文所述,Vertx发展不错,基于尝鲜的念头,想把Vertx引入到Kotlin的MPP中,不过到现在还没有搞成功,但是记录以下自己踩过的坑如下:

JVM Target的更改

默认情况虾,Kotlin的JVM plugin是编译到Java 1.6的,但是很多情况下,当我们用到Kotlin自己的一些扩展时,需要编译到1.8才可以。 基于目前的搜索,IDE(Idea) 和 命令行(grdle.kts)的情况分述如下:

IDE

  • Settings -> Build -> Compiler -> Kotlin 点选 1.8

  • Project Struure -> Facets 都使用project configuration

来源: stackoverflow

Console

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Or

tasks.withType(KotlinCompile::class).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

来源:github

多平台支持

In Intellij in Settings -> Build, Execution, Deployment-> Compiler -> Kotlin Compiler append to Additional command line parameters: field command -Xmulti-platform.

来源:stackoverflow

Vertx Gradle Plugin

本来打算使用 Vertx 的plugin来启动后台的,结果发现即使配置如下没问题的情况下,执行 gradle build vertxRun还是说找不到类,后来在这里才发现目前这个plugin根本就还不支持变化的文件结构。

//vertx {
// vertxVersion = "${vertx_version}"
// mainVerticle = "sample.MainVerticle"
//}
view raw build.gradle.kts hosted with ❤ by GitHub

Run 的方式来启动后端

费了半天劲学习Gradle DSL,掌握一点皮毛。最麻烦转的就是下面这点

jvmJar {
    dependsOn(jsBrowserWebpack)
    from(new File(jsBrowserWebpack.entry.name, jsBrowserWebpack.outputPath))
}

task run(type: JavaExec, dependsOn: [jvmJar]) {
    group = "application"
    main = "sample.MainKt"
    classpath(configurations.jvmRuntimeClasspath, jvmJar)
    args = []
}

转好之后

tasks{
val jsBrowserWebpack by getting(KotlinWebpack::class)
val jvmJar by getting(Jar::class){
dependsOn(jsBrowserWebpack)
from(File(jsBrowserWebpack.entry.name, jsBrowserWebpack.destinationDirectory?.canonicalPath))
}
val jvmRuntimeClasspath by configurations.getting
val run by creating(JavaExec::class){
dependsOn(jvmJar)
group = "application"
main = "sample.MainKt"
classpath(jvmRuntimeClasspath, jvmJar)
args = List<String?>(0, { _ -> "" })
}
}
view raw build.gradle.kts hosted with ❤ by GitHub

转的过程关键是你要给出类型,而类型的获取可以使用如下命令(以jsBrowserWebpack为例)):

aaron@aaron-w530:/var/docker/project/kotlin-vertx-react$ gradle help --task jsBrowserWebpack

Path
     :jsBrowserWebpack

Type
     KotlinWebpack (org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack)

来源1: Kotlin Official

来源2: jnizet

后端的Netty目前版本需要JAVA 8, JAVA 9不行

不行不是说啥都不行,而是你把log的DEBUG模式打开后,会有错误信息出现

使用H2内存数据库需要配置

一开始就用默认jdbc:h2:mem:regular 死活不行,需要更改为 jdbc:h2:mem:regular;DB_CLOSE_DELAY=-1;

Kotlin data class在json互相转的时候需要特殊依赖

正常情况下会报错误说是没有默认构造体,需要增加依赖implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.7"), 然后代码里添加Json.mapper.registerModule(KotlinModule()) 即可

Exposed 库的一个问题

当数据库是H2时(其他数据库不知道),创建自增主键表时,只能val id = integer("id").primaryKey().autoIncrement() , 顺序颠倒一下 val id = integer("id").autoIncrement().primaryKey(),就会报如下错误

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "ALTER TABLE USERS MODIFY COLUMN ID INT AUTO_INCREMENT PRIMARY[*] KEY"; SQL statement:
ALTER TABLE USERS MODIFY COLUMN ID INT AUTO_INCREMENT PRIMARY KEY [42000-197]

如果使用IntIdTable也是如此。


Qingfei Yuan

Written by Qingfei Yuan who builds useful things.

© 2019 - 2020 yuanqingfei
Creative Commons License