【问题标题】:Groovylang: setting system properties are not persistent?Groovylang:设置系统属性不是持久的?
【发布时间】:2018-02-13 18:00:36
【问题描述】:

在设置 java-system 属性时,我们遇到了以下问题。

环境:Groovy 版本:2.4.12 JVM:1.8.0_141 供应商:Oracle Corporation 操作系统:Windows 7

a) 在一个 Groovy 脚本中设置和打印系统属性,例如setprop.groovy 作品:

System.properties.'abc' = '123'
assert '123' == System.properties['abc']
println System.properties["abc"]

结果:1​​23

b) 尝试从另一个 JVM-Spawn 读取先前设置的属性,例如getprop.groovy 不起作用:

println System.properties["abc"]

结果:空

似乎设置属性并不是真正持久的。我应该怎么做,才能在 groovy 中保存真正持久的 java 环境变量?

【问题讨论】:

  • 你是如何运行你的脚本的?这个问题缺乏上下文和一个显示您的问题的简单示例
  • 我创建了两个 groovy 文件并从 shell 运行它们。我将在 git.bash、cmd 和 powershell 中进行尝试。
  • 那么下面的答案是正确的
  • 我的问题并没有用 Szymon 的回答解决,甚至他的写作也非常鼓舞人心。我正在寻找一个解决方案,来自一个 groovy 脚本,它使环境属性持久化。第二个 groovy 只是一个测试,用于读取不在同一个 JVM-Spawn 内的变量。它可以由 maven、gradle、ant 或 JVM 之外的任何东西读取,我想设置 Environment-Property。
  • 听起来你没有准确地定义你的问题。您可以在下面找到详细的答案,为什么您对设置系统属性的期望是错误的。您可以查看有关如何尝试从 Java 程序中导出 env 变量的问题(这是一个 hack,而不是解决方案)-stackoverflow.com/questions/318239/… 或者,您可以使用文件、数据库、队列等在程序之间共享数据。如果您正在寻找一些快速和简单的东西 - 将您的数据写入文件并从其他程序中读取。并注意可能的竞争条件。

标签: groovy windows-7-x64 system-properties


【解决方案1】:

System.properties 指的是可用于运行脚本的 JVM 进程的属性。当您运行 Groovy 脚本时,它会生成一个 VM 并在该 VM 内运行该脚本,例如

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.fc26.x86_64/bin/java -classpath /home/wololock/.sdkman/candidates/groovy/current/lib/groovy-2.4.12.jar -Dscript.name=/home/wololock/.sdkman/candidates/groovy/current/bin/groovy -Dprogram.name=groovy -Dgroovy.starter.conf=/home/wololock/.sdkman/candidates/groovy/current/conf/groovy-starter.conf -Dgroovy.home=/home/wololock/.sdkman/candidates/groovy/current -Dtools.jar=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.fc26.x86_64/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter --main groovy.ui.GroovyMain --conf /home/wololock/.sdkman/candidates/groovy/current/conf/groovy-starter.conf --classpath . test1.groovy

这是在 Linux 中运行groovy test1.groovy 脚本的过程。在您的情况下,test2.groovy 将能够访问 System.properties['abc'],如果您在由 test1.groovy 脚​​本生成的 VM 内运行 test2.groovy 脚本,例如

System.properties.'abc' = '123'
assert '123' == System.properties['abc']
println System.properties["abc"]

GroovyShell shell = new GroovyShell()
shell.parse(new File('test2.groovy')).run()

在这个例子中,我使用GroovyShell 运行test2.groovy,我在控制台中得到的是:

123
123

第一个123test1.groovy 脚本打印,第二个由test2.groovy 脚本打印。

您甚至可以尝试添加 Thread.sleep(10000)(休眠 10 秒)并并行运行这两个脚本并列出运行 groovy 的进程 - 您将看到生成的两个 VM 之间不共享属性。

如果您想从一个脚本获取另一个脚本的值,我建议从第一个脚本返回此值并将其作为参数传递给第二个脚本。

【讨论】:

  • 非常感谢您的努力。这不是关于在 groovy 脚本之间共享信息。它即将存储一个 java 环境属性,以便其他 java 应用程序也可以使用它们,即使在系统重新启动后也是如此。
  • 我接受这个答案,因为它暗示 groovy 中的环境属性只是 not 持久的。有关更多详细信息,我将提出另一个问题。感谢@SzymonStepniak 为您的患者服务。这真的是我在 StackOverflow 上的第二个问题。
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 2014-02-04
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
相关资源
最近更新 更多