我的
build.gradle.kts
文件中有以下内容:
plugins {
kotlin("jvm") version "1.9.20"
application
}
application {
mainClass.set("MainKt")
applicationDefaultJvmArgs = listOf("-Dlog_dir=MY_APP_HOME/log")
}
tasks.withType<CreateStartScripts>().configureEach {
doLast {
windowsScript.text = windowsScript.text.replace("MY_APP_HOME", "%APP_HOME%")
unixScript.text = unixScript.text.replace("MY_APP_HOME", "\$APP_HOME")
}
}
我发现 unix shell 脚本将我的 JVM 参数用单引号和双引号括起来。
DEFAULT_JVM_OPTS='"-Dlog_dir=$APP_HOME/log"'
因此,变量
$APP_HOME
不会扩展,我的应用程序的日志目录实际上是“$APP_HOME/log”。
我找不到任何方法来阻止这种行为。如何才能使变量正确扩展?
您可以使用1来做到这一点:
tasks.withType<CreateStartScripts>().configureEach {
doLast {
windowsScript.writeText(
windowsScript.readText().replace("APP_HOME_PLACEHOLDER", "%APP_HOME%")
unixScript.writeText(
unixScript.readText().replace("APP_HOME_PLACEHOLDER", "'\$APP_HOME'")
)
}
}
我使用了 Kotlin 的
writeText
和 readText
函数,因为 text
上的 File
运算符仅在 Groovy 中存在,我相信。
1注意,这是由 Gradle 项目中的集成测试(用 Groovy 编写)保证的:请参阅 GitHub。
测试代码在脚本中要替换的文本定义中有两个额外的反斜杠:它写为
"'\\\$APP_HOME'"
。这些额外的反斜杠之所以存在,是因为包含它的测试构建文件代码本身用三引号括起来。