【问题标题】:gradle application plugin and system environment variablesgradle 应用程序插件和系统环境变量
【发布时间】:2014-11-06 23:55:28
【问题描述】:

在我的项目中,我尝试在我的 build.gradle 中使用这样的系统环境配置我的应用程序:

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

如果 PORT 设置为常量,例如 9001,则此方法有效。但如果我将 PORT 更改为另一个变量,可执行脚本不会更改,它已在 build/install/bin 中编译为 PORT 的旧值/{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 作为解决方法,但我真的希望让配置尽可能简单。
  • 也许可以试试${System.getenv('PORT')}
  • @opal 这会呈现相同的结果。
  • 可能是值如何转义的错误。

标签: gradle


【解决方案1】:

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

如果您在 applicationDefaultJvmArgs 元素中写入“${System.env.PORT}”,则 PORT 环境变量会在构建时被替换,即在开发人员机器上,甚至在 Gradle 看到它之前,然后将该值用于启动脚本,这就是您所看到的。

在 Unix 启动脚本中引用 applicationDefaultJvmArgs 中的文字 $ 不是错误,这是故意的。 applicationDefaultJvmArgs 数组旨在跨所有目标平台移植,即 Unix 和 Windows。也就是说,生成 Unix/Windows 启动脚本,以便在两个平台上启动的 JVM 准确地看到在构建时传递给 applicationDefaultJvmArgs 的字符串参数。这意味着这些字符串中的任何 shell 元字符(如 $)都必须在 Unix 启动脚本中引用,因此如果您在其中一个参数中包含文字字符串 '$PORT',它会被完全复制,即没有 shell 变量扩展发生。如果“$PORT”被写入 unix starter 脚本中,$ 之前没有 \,那么 starter 脚本会做你想做的事——在 Unix 上。但是在 Windows 上,启动脚本是一个 cmd 批处理文件,$ 没有特殊含义(相反,必须使用 %% 进行变量扩展),因此字符串“$PORT”将按字面意思传递给 JVM,而您的程序无法按预期工作。您可能不关心 Windows(实际上我也不关心,至少不关心),但 Gradle,特别是具有所有功能的应用程序插件,旨在在所有支持的平台上完全可移植,所以事情就是这样立即实施。

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

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

对于未来,人们可能会考虑在 applicationDefaultJvmArgs 中为运行时环境变量提供某种独立于平台的表示法,然后应用程序插件将在每个启动器脚本中将其扩展为正确的特定于平台的变量表示法。但目前还没有计划,AFAIK。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2019-01-19
    • 2015-09-12
    • 2015-08-20
    • 1970-01-01
    • 2012-03-29
    • 2011-10-26
    相关资源
    最近更新 更多