有没有一种方法可以将命令行参数值放入Ktor Application模块而不是Main应用程序中?

时间:2019-07-29 00:21:03

标签: kotlin ktor

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

java -jar myApp.jar XXXXX YYYYY

我知道如何在主模块中获取XXXXX(通过使用简单的args [0]),但是我很难在Application模块中获取该值。

我想做这样的事情:

  

fun main(args:Array){

     

val port = System.getenv(“ PORT”)?. toInt()?:8080

     

val status = args [0]

     

embeddedServer(Netty,port = port,module =(Application :: mainModule()))。start(等待= true)   }

     

有趣的Application.mainModule(){

routing {get("/status") 

{call.respondText(//status variable value from main function, contentType = ContentType.Text.Html)
     

}}

2 个答案:

答案 0 :(得分: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)
}

您可以在 the official Ktor documentation 中阅读有关配置 Ktor 应用程序的更多信息。

答案 1 :(得分:0)

您可以将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)
}