Groovylang:设置系统属性不是持久的?

Groovylang:设置系统属性不是持久的?,groovy,windows-7-x64,system-properties,Groovy,Windows 7 X64,System Properties,这里我们在设置java系统属性时遇到了以下问题 Env:Groovy版本:2.4.12 JVM:1.8.0141供应商:Oracle公司操作系统:Windows 7 a) 在一个Groovy脚本中设置和打印系统属性,例如setprop.Groovy工作: System.properties.'abc' = '123' assert '123' == System.properties['abc'] println System.properties["abc"] 结果:123 b) 尝试从另一

这里我们在设置java系统属性时遇到了以下问题

Env:Groovy版本:2.4.12 JVM:1.8.0141供应商:Oracle公司操作系统:Windows 7

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

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

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

println System.properties["abc"]
结果:空


似乎设置属性并不是真正持久的。要在groovy中真正持久地保存java环境变量,我必须做什么?

系统。属性是指运行脚本的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
脚本的过程。在您的情况下,如果在
test1.groovy
脚本生成的VM中运行
test2.groovy
脚本,那么
test2.groovy
将能够访问
System.properties['abc']

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
第一个
123
test1.groovy
脚本打印,第二个由
test2.groovy
脚本打印

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


如果希望从一个脚本到另一个脚本获取值,我建议从第一个脚本返回该值,并将其作为参数传递给第二个脚本

你是如何运行你的脚本的?这个问题缺少上下文和一个简单的例子来说明您的问题。我已经创建了两个groovy文件并从shell运行它们。我将在git.bash、cmd和powershell中试用。然后下面的答案是正确的。我的问题并没有用Szymon的答案解决,即使他的作品也非常鼓舞人心。我正在从groovy脚本中寻找一种解决方案,它可以使环境属性持久化。第二个groovy只是一个测试,用于读取不在同一个jvmspawn中的变量。它可以由maven、gradle、ant或JVM之外的任何人阅读,我想设置Environment-Property。听起来你没有精确定义你的问题。在下面,您可以找到详细的答案,解释为什么您对设置系统属性的期望是错误的。您可以检查如何尝试从Java程序导出env变量的问题(这是一种黑客行为,不是一种解决方案)-或者您可以使用文件、数据库、队列等在程序之间共享数据。如果您正在寻找快速简单的方法,请将数据写入文件并从其他程序读取。并注意可能的比赛情况。非常感谢您的努力。这与在groovy脚本之间共享信息无关。它将存储一个java环境属性,以便将它们也用于其他java应用程序,即使在系统重新启动之后也是如此。关于进一步的细节,我将提出另一个问题。感谢@SzymonStepniak为您的患者服务。这是我在StackOverflow上的第二个问题。