4

我正在尝试从 Ktor 构建一个应用程序,最终应该通过 fatjar 执行。fatjar 允许使用如下参数:

java -jar myApp.jar XXXXX YYYYY

我知道如何XXXXX在主模块中获取(通过使用 simple args[0]),但我很难在应用程序模块中获取该值。

我想做这样的事情:

fun main(args: Array<String>) {
    val port = System.getenv("PORT")?.toInt() ?: 8080
    val status = args[0]
    embeddedServer(Netty, port = port, module = (Application::mainModule())).start(wait = true)
}

fun Application.mainModule() {
    routing {
        get("/status") {
            call.respondText(
                <status variable from main function>,
                contentType = ContentType.Text.Html
            )
        }
    }
}
4

2 回答 2

3

您可以将参数的方法引用替换为module普通的 lambda。在这个 lambda 中,您可以使用所需的参数调用模块函数:

fun Application.mainModule(args: Array<String>) {
    routing {
        get("/status") {
            //...
        }
    }
}

fun main(args: Array<String>) {
    val server = embeddedServer(Netty, port = 8080) {
        mainModule(args)
    }
    server.start(wait = true)
}

细节

该函数embeddedServer具有module作为最后一个参数。参数的类型是一个Application没有任何参数并Unit作为返回值的类型的函数:

fun embeddedServer(..., module: Application.() -> Unit) : TEngine

这就是您可以提供Application::mainModuleas 函数引用的原因。它与参数的类型定义完全匹配。但是您也可以提供一个尾随 lambda 而不是这个函数引用:

val server = embeddedServer(Netty, port = 8080) { 
    // this is Application
    routing {
        get("/status") {
            //...
        }
    }
}

在此 lambdathis中的类型与您的 function 中的类型Application完全相同Application.mainModule。这意味着在这个 lambda 中,您可以轻松调用其他类型的函数Application。在我的回答中,我创建了Application.mainModulewithargs作为参数并在尾随 lambda 中调用此函数。

于 2019-07-29T06:45:02.070 回答
2

要传递新的配置参数,您可以在它前面加上-P:propName=.

因此,如果您想csv从命令行传递一个以值命名的属性,您可以执行以下操作:

fun main(args: Array<String>) {
    val csvFileName = "-P:csv=${args[0]}"
    EngineMain.main(arrayOf(csvFileName))
}

args您也可以通过使用-P:csv=myfile.csv作为命令行参数来传递参数而无需修改。

然后,在您的模块中,您可以通过environment.config.property("csv").getString().

fun Application.module() {
    val csvFileName = environment.config.property("csv").getString()
    println(csvFileName)
}

您可以在官方 Ktor 文档中阅读有关配置 Ktor 应用程序的更多信息。

于 2021-02-21T10:01:50.330 回答