Ktor - 由 Application.module 函数中的主函数初始化的访问变量

Posted

技术标签:

【中文标题】Ktor - 由 Application.module 函数中的主函数初始化的访问变量【英文标题】:Ktor - Access variable initilized by main function in Application.module function 【发布时间】:2021-05-22 13:15:12 【问题描述】:
var foo : String? = null

fun main(args: Array<String>): Unit 
    foo = "Hello World"
    io.ktor.server.netty.EngineMain.main(args)


@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) 
    // foo is null here

我如何在Application.module 中访问foo,为什么这是一个问题?

【问题讨论】:

【参考方案1】:

您无法访问模块中的此类变量,因为 Ktor 在不同的类加载器中加载您的应用程序(和模块)。

当你调用EngineMain.main()时,它会经历一长串调用,其中一个步骤是在createApplication()方法here中创建一个新的类加载器。 createClassLoader()的实现是here。

【讨论】:

那么唯一的方法就是将命令行参数传递给Application.module-P 并在那里执行所有初始化? @daka 可能还有更多方法,但我知道的唯一方法就是您所说的,所以是的,这是真的。顺便说一句,你可以有多个模块,你不限于只有一个。【参考方案2】:

您可以按以下格式传递任意参数:-P:&lt;argument&gt; 其中&lt;argument&gt; 是您的参数的实际名称。在Application.module 中,您可以通过config 对象访问它们:

fun Application.main() 
    println(environment.config.property("<argument>").getString())

【讨论】:

谢谢,但为什么Application.module 中的foo 为空?

以上是关于Ktor - 由 Application.module 函数中的主函数初始化的访问变量的主要内容,如果未能解决你的问题,请参考以下文章

在单独的线程中初始化 Ktor 可以吗?

在 Ktor 0.9.0 servlet 中控制 cookie 生命周期

Ktor 客户端 IOS 和自签名证书

Ktor 1.0 发布:Kotlin Web 框架;GoLand 2018.3 正式版发布!| 更新

Ktor 启动示例错误

KTor 站点无法访问