【问题标题】:Ktor - Access variable initilized by main function in Application.module functionKtor - 由 Application.module 函数中的主函数初始化的访问变量
【发布时间】: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,为什么这是一个问题?

【问题讨论】:

    标签: kotlin ktor


    【解决方案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 为空?
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2022-11-30
    • 2017-01-01
    相关资源
    最近更新 更多