Ktor練功場#6筆記-Fat Jar部署

YungHsin
Oct 19, 2020

--

本次練功場學習的重點:

把Ktor專案打包成Jar部署到伺服器

前言

前幾次的組長都是在教學怎麼樣去使用Ktor的功能,但是大家應該都有發現這些動作都只是在自己的電腦本機上開發,連結都是出現http://0.0.0.0:8080,不管是用網頁測試GET還是用IntelliJ Ultimated版本或是用Postman去呼叫POST API,都只限於在自己的電腦上。但是有經驗的工程師應該早就發現,如果要給別人用至少也要先能用內網給自己旁邊的同事幫忙一起測試,或是有個能對外連線的測試機,把程式放到那一台機器去給大家測試,內部測試完後,才會繼續接下來的事(各家公司上版流程不同),最終才會真正進入到正式機發佈。

開發流程

在講解部署方式之前,先了解一下整個專案的開發流程,大致上分成四大步驟:

程式撰寫-> Gradle編譯/打包-> 上傳/儲存->雲端主機

前兩個動作相信在前五次的練功場大家都寫code測試功能都已經駕輕就熟了,gradle build, gradle run相信都執行很多次了,現在就差在把程式打包成可執行的檔案。

什麼是Fat Jar?

有寫過Java經驗的人應該就對jar不陌生了,Jar就是把你寫的程式編譯出來的class檔案給裝到Jar裡頭,而Fat Jar就是會把一些相依的librar也打包起來變,所以就成一個檔案頗大的肥肥Jar檔案。(不知這樣解釋對不對…)

其實我有試過如果只是單純用gradle build,也會在build/libs底下出現jar,然後檔案大小只有25KB,但是用Fat Jar的方法build出來就會變成18.6MB,也難怪要被叫Fat Jar了。

怎麼打包Fat Jar?

要在Ktor專案打包Fat Jar要先裝一個Shadow套件,也就是會將你專案相依的部分一起打包的工具。

第一步:在build.gradle加上有標示粗體的程式碼:

buildscript {
repositories {
jcenter()
}

dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version"
}
}

apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'

group 'yaya.idv'
version '1.0.1'
mainClassName = "io.ktor.server.netty.EngineMain"

shadowJar {
manifest {
attributes 'Main-Class': mainClassName
}
}


sourceSets {
main.kotlin.srcDirs = main.java.srcDirs = ['src']
test.kotlin.srcDirs = test.java.srcDirs = ['test']
main.resources.srcDirs = ['resources']
test.resources.srcDirs = ['testresources']
}

repositories {
mavenLocal()
jcenter()
maven { url 'https://kotlin.bintray.com/ktor' }
maven { url 'https://kotlin.bintray.com/kotlin-js-wrappers' }
}

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "io.ktor:ktor-server-netty:$ktor_version"
implementation "ch.qos.logback:logback-classic:$logback_version"
implementation "io.ktor:ktor-server-core:$ktor_version"
implementation "io.ktor:ktor-html-builder:$ktor_version"
implementation "org.jetbrains:kotlin-css-jvm:1.0.0-pre.31-kotlin-1.2.41"
implementation "io.ktor:ktor-gson:$ktor_version"
implementation "io.ktor:ktor-client-core:$ktor_version"
implementation "io.ktor:ktor-client-core-jvm:$ktor_version"
implementation "io.ktor:ktor-client-apache:$ktor_version"
testImplementation "io.ktor:ktor-server-tests:$ktor_version"
}

第二步:在Terminal執行gralde指令

./gradlew shadowJar

第三步: Fat Jar在build/libs/產生成功

第四步: 在Terminal將Jar執行起來

export PORT=8080 && java -jar build/libs/yaya_app-1.0.1-all.jar

這邊的PORT=8080其實就是對應在Ktor專案的application.conf的設定,依照你的需求可更動port的設定。

port = ${?PORT}

以上四步驟就是Fat Jar打包,並且在你的本機系統上執行起來。

怎麼更改打包出來的Jar檔名?

直接改settings.gradle的rootProject.name

rootProject.name = "yaya_app"

然後版號在build.gradle的version變更即可

version '1.0.1'

總結

其實只要能學會手動把Jar產生並在你自己的本機系統上能執行起來,那要移植到任何的作業系統上去執行的概念其實都差不多了,只是可能差在不同系統的環境設定不太一樣,但基本上Jar主要就是只要有JVM的環境,然後Java版本沒有衝突到,應該都能順利啟動了。

自我練習

需要抽空來練習部署(雖然都有碰過,但是都是好幾年前了….),帳號密碼都忘記已生鏽需要重新申請,預計有空試著寫寫看本機、GCP、AWS、Azure,就看之後有沒有機會發表了。

11/2有空寫出AWS來了,分成兩篇教學文

(1)在AWS建立虛擬伺服器: https://link.medium.com/d5WAcMS42ab

(2)在AWS部署Fat Jar: https://link.medium.com/Dp2vYEOm3ab

先前有好像有試著寫把Ktor直接跑在Docker上,但是也是沒有上到雲端就是了…

以上就是Ktor練功場#6的內容,學會打包Fat Jar跟部署到雲端(to do)!

歡迎各位也一起來練功場學習Ktor囉!

https://tw.kotlin.tips/dojos/ktortw

--

--

YungHsin
YungHsin

No responses yet