Gradle应用程序插件和系统环境变量

5
在我的项目中,我尝试使用类似以下代码在build.gradle文件中配置我的应用程序与系统环境的连接:

apply plugin: 'application'
applicationDefaultJvmArgs = ["-Ddw.server.applicationConnectors[0].port=${System.env.PORT}"]

如果PORT被设置为一个常量,比如9001,那么这个方法是可行的。但是如果我将PORT更改为另一个变量,可执行脚本不会改变,它已经编译成旧值的PORT在build/install/bin/{executable-script}中,就像这样:

DEFAULT_JVM_OPTS='"-Ddw.server.applicationConnectors[0].port=9001"'

与我期望的不同,

DEFAULT_JVM_OPTS='"-Ddw.server.applicationConnectors[0].port=$PORT"'

有没有一种方法告诉应用插件使用系统环境变量而不是评估 system.env 变量?顺便说一句,我也尝试过不使用单引号来避免评估 $PORT 表达式。
applicationDefaultJvmArgs = ['-Ddw.server.applicationConnectors[0].port=$PORT']

并且

applicationDefaultJvmArgs = ['-Ddw.server.applicationConnectors[0].port=\$PORT']

但这两个编译后的代码都无法运行,下面是正确的代码。
DEFAULT_JVM_OPTS='"-Ddw.server.applicationConnectors[0].port=\$PORT"'

我本可以使用WEBAPP_OPTS进行解决,但我真的希望将配置保持尽可能简单。 - nilsmagnus
也许尝试 ${System.getenv('PORT')}? - Opal
@opal 这将呈现相同的结果。 - nilsmagnus
1
可能是值转义方式中的一个错误。 - Peter Niederwieser
1个回答

12

(我是提交applicationDefaultJvmArgs功能的Gradle贡献者)

如果您在applicationDefaultJvmArgs元素中写入"${System.env.PORT}",则PORT环境变量会在构建时替换,即在开发人员机器上,在Gradle看到它之前就已经被替换了,并且该值随后用于启动脚本,这就是您看到的情况。

在Unix启动脚本中引用applicationDefaultJvmArgs中的$符号不是一个错误,而是有意的。applicationDefaultJvmArgs数组旨在在所有目标平台上具有可移植性,即Unix和Windows。也就是说,生成Unix/Windows启动脚本时,必须确保在两个平台上启动的JVM看到的正好是在构建时传递给applicationDefaultJvmArgs的字符串参数。这意味着Unix启动脚本中必须引用任何类似$的shell元字符,以便如果一个参数中包含'$PORT'字符串,它将被精确地复制,即不进行shell变量扩展。如果"$PORT"在unix启动脚本中没有在$前面加上\,那么启动脚本将按您想要的方式处理Unix系统。但在Windows系统上,启动脚本是cmd批处理文件,$没有特殊含义(必须使用%%进行变量扩展),因此"$PORT"字符串将按字面传递给JVM,您的程序将无法按预期工作。您可能不关心Windows(实际上我也不太关心),但是Gradle,特别是带有所有功能的application插件,旨在在所有支持的平台上完全可移植,因此现在就是以这种方式实现的。

如果您真的想在运行时扩展$PORT变量,即在用户机器上运行启动脚本时进行扩展,那么必须相应地修改生成的启动脚本,即后处理步骤。例如:

startScripts {
    doLast {
        unixScript.text = unixScript.text.replace('\\$PORT', '$PORT') 
        windowsScript.text = windowsScript.text.replace('\\$PORT', '%PORT%') //untested
    }
}

对于未来,可以考虑在applicationDefaultJvmArgs中使用一种与平台无关的符号表示运行时环境变量,并且应用程序插件将在每个启动脚本中将其扩展为正确的平台特定变量符号。但目前我不知道有这方面的计划。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接