在開發過程中,快速反饋迴圈週期非常重要。 通常,重新啟動伺服器可能需要一些時間,因此Ktor提供了一個基本的自動過載工具,可以重新載入Application類。
注:自動過載不支援java 9,如果要使用該功能則需要使用JDK8;
類改變時自動重新載入
在這兩種情況下,使用embeddedServer或配置檔案時,您必須提供一個與您要監視的類載入器相匹配的監視子字串列表。
例如,使用gradle時的典型類載入器如下所示:
/Users/user/projects/ktor-exercises/solutions/exercise4/build/classes/kotlin/main
複製程式碼
在這種情況下,您可以使用solutions/exercise4字串或者僅使用exercise4字串,它將匹配該類載入器。
使用embeddedServer
使用自定義主伺服器和embeddedServer時,可以使用可選引數watchPaths提供將被監視和重新載入的子路徑列表。
fun main(args: Array<String>) {
embeddedServer(
Netty,
watchPaths = listOf("solutions/exercise4"),
port = 8080,
module = Application::mymodule
).apply { start(wait = true) }
}
fun Application.mymodule() {
routing {
get("/plain") {
call.respondText("Hello World!")
}
}
}
複製程式碼
通過application.conf配置
使用配置檔案時,例如使用EngineMain從命令列執行或託管在伺服器容器中:要啟用此功能,請將watch的key新增到ktor.deployment配置。
watch - 應該監視並自動重新載入的類路徑條目的陣列。
ktor {
deployment {
port = 8080
watch = [ module1, module2 ]
}
…
}
複製程式碼
現在,watch鍵只是與contains相匹配的字串,與載入的應用程式中的類路徑條目相對應,例如jar名稱或專案目錄名稱。 然後使用特殊的ClassLoader載入這些類,該類在檢測到更改時被回收。
注:類路徑條目看起來像file:/path/to/project/build/classes/myproject.jar,所以/ project會匹配,但com.mydomain不會。
在原始碼更改時自動重新編譯
由於自動過載功能僅檢測類檔案中的更改,因此您必須自己編譯應用程式。 你可以在執行時使用IntelliJ IDEA和Build - > Build Project來實現。
但是,您也可以使用gradle自動檢測源更改併為您編譯。 您只需在專案資料夾中開啟另一個終端並執行:gradle -t build。 它將編譯應用程式,在執行此操作後,它將偵聽其他源更改並在必要時重新編譯。 因此,觸發自動類重新載入。 然後,您可以使用另一個終端以gradle run執行應用程式。
例子
您可以使用build.gradle或直接在IDE中執行應用程式。 執行示例檔案中的main方法,或執行:io.ktor.server.netty.EngineMain.main。 使用commandLineEnvironment的EngineMain將負責載入application.conf檔案(即HOCON格式)。
main.kt
package io.ktor.exercise.autoreload
import io.ktor.application.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
// Exposed as: `static void io.ktor.exercise.autoreload.MainKt.main(String[] args)`
fun main(args: Array<String>) {
//io.ktor.server.netty.main(args) // Manually using Netty's EngineMain
embeddedServer(
Netty, watchPaths = listOf("solutions/exercise4"), port = 8080,
module = Application::module
).apply { start(wait = true)
}
// Exposed as: `static void io.ktor.exercise.autoreload.MainKt.module(Application receiver)`
fun Application.module() {
routing {
get("/plain") {
call.respondText("Hello World!")
}
}
}
複製程式碼
application.conf
ktor {
deployment {
port = 8080
watch = [ solutions/exercise4 ]
}
application {
modules = [ io.ktor.exercise.autoreload.MainKt.module ]
}
}
複製程式碼