Java 如何使用GroovyShell传递JVM参数和脚本参数?

Java 如何使用GroovyShell传递JVM参数和脚本参数?,java,spring-boot,gradle,groovy,Java,Spring Boot,Gradle,Groovy,所以我有一个Groovy脚本: // TestScript.groovy println args 然后在一个梯度任务中 test { String profile = System.getenv("spring.profiles.active") jvmArgs '-Dspring.profiles.active=$profile" // THIS DOES NOT WORK! :( doLast { new GroovyShell().r

所以我有一个Groovy脚本:

// TestScript.groovy
println args
然后在一个梯度任务中

test {
  String profile = System.getenv("spring.profiles.active")
  jvmArgs '-Dspring.profiles.active=$profile" // THIS DOES NOT WORK! :(

  doLast {
    new GroovyShell().run(file('package.TestScript.groovy'))
  }
}
我需要做的是两件事:

a) 传递到
TestScript.groovy
程序参数中,以便打印出
args
数组

b) 将Spring引导配置文件传递给JVM,即
Spring.profiles.active=dev

有什么建议吗

注意,我正在使用Groovy 2.4.3并参考以下文档:

我尝试了以下操作,但未成功:

doLast {
  Binding b = new Binding();
  b.setVariable('spring.profiles.active', $profile)
  new GroovyShell(b).run(file('package.TestScript.groovy'))
}
工作示例

如果我们有一个将参数写入文件的脚本:

// TestScript.groovy

try {
    new File("out.txt").withWriter { writer ->
        args.each { arg ->
            writer.write("TRACER arg : ${arg}\n")
        }
    }
} catch (Exception ex) {
    new File("error.txt").withWriter { writer ->
        writer.write("TRACER caught exception ${ex.message}\n")
    }
}
然后我们可以用这个Gradle任务来测试它:

test {
    doLast {
        def profile = project["spring.profiles.active"]

        def script = new File("${projectDir}/TestScript.groovy")
        def args = ["exampleArgVal1", "exampleArgVal2", profile]

        new GroovyShell().run(script, args)
    }
}
请注意,参数是这样传递给Gradle的:

gradle clean test -Pspring.profiles.active=TEST_PROFILE
工作示例

如果我们有一个将参数写入文件的脚本:

// TestScript.groovy

try {
    new File("out.txt").withWriter { writer ->
        args.each { arg ->
            writer.write("TRACER arg : ${arg}\n")
        }
    }
} catch (Exception ex) {
    new File("error.txt").withWriter { writer ->
        writer.write("TRACER caught exception ${ex.message}\n")
    }
}
然后我们可以用这个Gradle任务来测试它:

test {
    doLast {
        def profile = project["spring.profiles.active"]

        def script = new File("${projectDir}/TestScript.groovy")
        def args = ["exampleArgVal1", "exampleArgVal2", profile]

        new GroovyShell().run(script, args)
    }
}
请注意,参数是这样传递给Gradle的:

gradle clean test -Pspring.profiles.active=TEST_PROFILE

谢谢你!我喜欢你链接到一个有效的解决方案!现在的问题是,运行该脚本的脚本没有运行测试用例。工作方式是TestSuite实际上有一个运行程序,调用@SpringBootTest并整理结果。这里的问题是TestSuite.groovy现在找不到它的任何导入。我试图通过向类加载器添加类路径来解决这个问题,但没有成功。我如何才能让GroovyShell继承测试任务的类路径?我尝试了另一种方法,我有一个突出的方法可以提供对问题的更多见解。@groovydude我认为您的问题(关于:“现在的问题”)超出了原始问题的范围。请注意,第二条评论中的链接指向这个问题(!)。@Michael Easter你是对的。我已将该问题标记为已接受。我将创建一个新问题。我希望您能快速解决如何在中添加正确的类路径的问题。我试过GroovyCassLoader,但没有成功。谢谢!我喜欢你链接到一个有效的解决方案!现在的问题是,运行该脚本的脚本没有运行测试用例。工作方式是TestSuite实际上有一个运行程序,调用@SpringBootTest并整理结果。这里的问题是TestSuite.groovy现在找不到它的任何导入。我试图通过向类加载器添加类路径来解决这个问题,但没有成功。我如何才能让GroovyShell继承测试任务的类路径?我尝试了另一种方法,我有一个突出的方法可以提供对问题的更多见解。@groovydude我认为您的问题(关于:“现在的问题”)超出了原始问题的范围。请注意,第二条评论中的链接指向这个问题(!)。@Michael Easter你是对的。我已将该问题标记为已接受。我将创建一个新问题。我希望您能快速解决如何在中添加正确的类路径的问题。我尝试了GroovyCassLoader,但没有成功。