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:<argument>
其中<argument>
是您的参数的实际名称。在Application.module
中,您可以通过config
对象访问它们:
fun Application.main()
println(environment.config.property("<argument>").getString())
【讨论】:
谢谢,但为什么Application.module
中的foo
为空?以上是关于Ktor - 由 Application.module 函数中的主函数初始化的访问变量的主要内容,如果未能解决你的问题,请参考以下文章
在 Ktor 0.9.0 servlet 中控制 cookie 生命周期