2014-09-12 116 views
3

在我的项目,我想我的配置与系统环境中的应用就像这在我的build.gradle:gradle这个应用插件和系统环境变量

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

如果端口设置为常数这个工作,可以说, 9001.但是,如果我将PORT更改为另一个变量,则可执行脚本不会更改,它已在build/install/bin/{executable-script}中编译为旧值PORT,如下所示:

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"' 
+0

我本可以使用WEBAPP_OPTS作为解决方法,但我真的想保持配置尽可能简单。 – nilsmagnus 2014-09-12 18:30:28

+0

也许试试'$ {System.getenv('PORT')}'? – Opal 2014-09-12 19:27:13

+0

@opal这呈现相同的结果。 – nilsmagnus 2014-09-13 06:18:45

回答

6

(我的摇篮贡献者谁提交的applicationDefaultJvmArgs功能)

如果你写“$ {} System.env.PORT”到applicationDefaultJvmArgs元素,港口环境变量在构建时取代,即在开发者机器上,在Gradle甚至看到它之前,然后在初学者脚本中使用这个值,这就是你所看到的。

在applicationDefaultJvmArgs文字$被在Unix启动脚本所引用的其实不是一个错误,这是故意的。 applicationDefaultJvmArgs数组意味着可以在所有目标平台上移植,即Unix和Windows。也就是说,Unix/Windows启动脚本的生成使得两个平台上启动的JVM都可以精确地看到在构建时传递给applicationDefaultJvmArgs的字符串参数。这意味着,在这些字符串任何shell元字符,比如$必须在Unix启动脚本被引用,因此,如果您在其中一个参数有文字字符串“$ PORT”,它就会被复制完全一样的,即没有shell变量扩展发生。如果“$ PORT”被写入unix starter脚本而没有在$之前,那么在Unix上,起始脚本会做你想做的事情。在Windows上,虽然,在启动脚本是CMD批处理文件,$没有特殊的意义(而不是%%有用于变量扩展),因此字符串“$ PORT”将被逐字传递给JVM,和你程序不会按预期工作。你可能不关心的Windows(其实我也不,没有太大的至少),但摇篮,特别用其所有功能的应用程序插件,都意味着是在所有支持的平台完全可移植的,所以这是怎么回事儿现在执行。

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

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

对于未来,人们可能会想到有某种在applicationDefaultJvmArgs运行时环境变量与平台无关的标记,然后将应用程序插件将扩大在每个启动脚本,以正确的平台特定的变量符号。但目前还没有计划,AFAIK。

相关问题