我试图groovysh在Windows 8上打开Groovy Shell()并得到以下输出:
java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Run Code Online (Sandbox Code Playgroud)
打印完上述消息后,shell按预期启动.
我从Java调用多个Groovy脚本,它们都包含长期存在的Groovy对象.
我希望我的Groovy脚本能够对Java类(具有大约100个实例)的Java元类进行一些更改.但是,脚本应该能够进行不同的更改,其中一个脚本中的更改不应该反映在其他脚本中.
问题:Java类的元类在所有脚本中共享.
此问题类似于在执行GroovyShell后如何撤消元类更改?但在这种情况下,我希望同时执行两个脚本,因此在脚本执行后无法重置.
SameTest.java
public interface SameTest {
void print();
void addMyMeta(String name);
void addJavaMeta(String name);
void callMyMeta(String name);
void callJavaMeta(String name);
}
Run Code Online (Sandbox Code Playgroud)
SameSame.java
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
public class SameSame {
public SameTest launchNew() {
try {
GroovyScriptEngine scriptEngine = new GroovyScriptEngine(new String[]{""});
Binding binding = new Binding();
binding.setVariable("objJava", this);
SameTest script = (SameTest) scriptEngine.run("test.groovy", binding);
return script;
} catch (Exception | AssertionError e) {
throw new RuntimeException(e);
}
}
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 当我运行下面的Jenkins管道脚本时:
def some_var = "some value"
def pr() {
def another_var = "another " + some_var
echo "${another_var}"
}
pipeline {
agent any
stages {
stage ("Run") {
steps {
pr()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
groovy.lang.MissingPropertyException: No such property: some_var for class: groovy.lang.Binding
Run Code Online (Sandbox Code Playgroud)
如果def删除some_var它,它工作正常.有人可以解释导致此行为的范围规则吗?
我运行groovysh,并键入以下代码:
groovy:000> String s = "Hello"
===> Hello
groovy:000> s
ERROR groovy.lang.MissingPropertyException:
No such property: s for class: groovysh_evaluate
at groovysh_evaluate.run (groovysh_evaluate:2)
...
groovy:000>
Run Code Online (Sandbox Code Playgroud)
怎么访问s这里?
(如果我String s = "Hello"改为s = "Hello",我可以访问它.但我想知道如何在示例中访问它)
UPDATE
我想用来String s = "Hello"定义一个变量,因为我想声明它的类型.例如,如果我写:
Date date = []
Run Code Online (Sandbox Code Playgroud)
日期将是一个java.util.Date.但如果我写:
date = []
Run Code Online (Sandbox Code Playgroud)
这将是一个ArrayList.
我GroovyShell在我的程序中使用"表达式评估器/引擎".它接受两个输入:(a)一个或多个init脚本(b)用户定义的脚本.然后两者在运行时连接成大块脚本(文本)并提供给shell.
String initScripts = getFromDB()
String userScript = getFromUser()
def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)
Run Code Online (Sandbox Code Playgroud)
上面的代码将在循环中运行,其中的内容userScript将有所不同.
到目前为止,initScripts仅包含def $yyyy = new Date().format('yyyy')可能在userScript(例如print "$yyyy 001")中引用的变量定义(例如).
有没有更有效的方法呢?(例如重用shell,怎么样?)因为现在它非常慢.
编辑: Groovy是必须的.请不要推荐其他脚本引擎.
编辑:我在想GroovyShell是否可以这样做(伪代码):
def shell = new GroovyShell()
shell.evaluate(initScripts)
for each userScript in DB {
shell.put(userScript )
def result = shell.evaluateThat()
println "Result is $result"
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?(上次我用谷歌搜索它是不可能的,但我希望我错了)
我对Groovy很新.如何列出我传递给Binding构造函数的所有变量?
考虑到我有以下内容:
@Test
public void test() {
List<String> outputNames = Arrays.asList("returnValue", "ce");
String script = getScript();
Script compiledScript = compileScript(script);
CustomError ce = new CustomError("shit", Arrays.asList(new Long(1)));
Map<String, Object> inputObjects = new HashMap<String, Object>();
inputObjects.put("input", "Hovada");
inputObjects.put("error", ce);
Binding binding = new Binding(inputObjects);
compiledScript.setBinding(binding);
compiledScript.run();
for (String outputName : outputNames) {
System.out.format("outputName : %s = %s", outputName, binding.getVariable(outputName));
}
}
private Script compileScript(String script) {
GroovyShell groovyShell = new GroovyShell();
Script compiledScript = groovyShell.parse(script);
return compiledScript;
}
Run Code Online (Sandbox Code Playgroud)
如何在groovy.script中迭代所有变量(通过hashMap)?
在groovy中获取当前日期和时间的代码是什么?我环顾四周,找不到一个简单的方法来做到这一点.基本上我正在寻找相当于Linux的date
我有 :
import java.text.SimpleDateFormat
def call(){
def date = new Date()
sdf = new SimpleDateFormat("MM/dd/yyyy")
return sdf.format(date)
}
Run Code Online (Sandbox Code Playgroud)
但我也需要打印时间.
我想卷曲一个URL并将响应捕获到一个变量中.
当我卷曲命令并回显其输出时,我得到正确的响应,如下所示
sh 'output=`curl https://some-host/some-service/getApi?apikey=someKey`;echo $output;'
Run Code Online (Sandbox Code Playgroud)
我想在变量中捕获相同的响应,并使用该响应进行进一步操作
下面是我的Jenkins文件
pipeline {
agent {
label "build_2"
}
stages {
stage('Build') {
steps {
checkout scm
sh 'npm install'
}
}
stage('Build-Image') {
steps {
echo '..........................Building Image..........................'
//In below line I am getting Output
//sh 'output=`curl https://some-host/some-service/getApi?apikey=someKey`;echo $output;'
script {
//I want to get the same response here
def response = sh 'curl https://some-host/some-service/getApi?apikey=someKey'
echo '=========================Response===================' + response
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我在Jenkinsfile中需要做些什么改变吗?
我添加了使用 GroovyShell 在我的 Java 应用程序中解析和评估 groovy 脚本的功能。哪个 Maven 工件是我的构建中包含的最低限度?
我知道 groovy-all 肯定会包含我需要的一切,但我猜我也可以使用一个更小的包?
我不得不问这个问题感觉很荒谬,但我似乎无法将多个 jar 文件添加到 groovyConsole 和 groovysh 的类路径中。如何将多个 jar 文件添加到类路径?这是我尝试过的:
groovyConsole -cp ~/lib/compile/jar/mysql-connector-java-5.1.32.jar:~/lib/compile/jar/ojdbc6-11.2.0.3.jar
但是,当我在控制台中执行此代码时,我得到以下信息:
file:/Users/charlie/lib/compile/jar/mysql-connector-java-5.1.32.jar
file:/Users/charlie/projects/fuseanalytics/./
file:/Users/charlie/.gvm/groovy/current/lib/ant-1.9.3.jar
file:/Users/charlie/.gvm/groovy/current/lib/ant-antlr-1.9.3.jar
file:/Users/charlie/.gvm/groovy/current/lib/ant-junit-1.9.3.jar
file:/Users/charlie/.gvm/groovy/current/lib/ant-launcher-1.9.3.jar
file:/Users/charlie/.gvm/groovy/current/lib/bsf-2.4.0.jar
file:/Users/charlie/.gvm/groovy/current/lib/commons-cli-1.2.jar
file:/Users/charlie/.gvm/groovy/current/lib/commons-logging-1.1.1.jar
file:/Users/charlie/.gvm/groovy/current/lib/gpars-1.2.1.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-ant-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-bsf-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-console-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-docgenerator-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-groovydoc-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-groovysh-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-jmx-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-json-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-jsr223-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-nio-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-servlet-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-sql-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-swing-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-templates-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-test-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-testng-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/groovy-xml-2.3.6.jar
file:/Users/charlie/.gvm/groovy/current/lib/hamcrest-core-1.3.jar
file:/Users/charlie/.gvm/groovy/current/lib/ivy-2.3.0.jar
file:/Users/charlie/.gvm/groovy/current/lib/jansi-1.11.jar
file:/Users/charlie/.gvm/groovy/current/lib/jcommander-1.35.jar
file:/Users/charlie/.gvm/groovy/current/lib/jline-2.11.jar
file:/Users/charlie/.gvm/groovy/current/lib/jsp-api-2.0.jar
file:/Users/charlie/.gvm/groovy/current/lib/jsr166y-1.7.0.jar
file:/Users/charlie/.gvm/groovy/current/lib/junit-4.11.jar
file:/Users/charlie/.gvm/groovy/current/lib/multiverse-core-0.7.0.jar
file:/Users/charlie/.gvm/groovy/current/lib/qdox-1.12.1.jar
file:/Users/charlie/.gvm/groovy/current/lib/servlet-api-2.4.jar
file:/Users/charlie/.gvm/groovy/current/lib/testng-6.8.8.jar
file:/Users/charlie/.gvm/groovy/current/lib/xmlpull-1.1.3.1.jar
file:/Users/charlie/.gvm/groovy/current/lib/xstream-1.4.7.jar
Run Code Online (Sandbox Code Playgroud)
请注意,第一个 jar 文件 mysql jar 文件已添加到类加载器中,但未添加第二个 jar 文件 oracle jar 文件。我也试过两次使用 -cp 参数,例如:
groovyConsole -cp ~/lib/compile/jar/mysql-connector-java-5.1.32.jar -cp ~/lib/compile/jar/ojdbc6-11.2.0.3.jar
Run Code Online (Sandbox Code Playgroud)
但这只是失败并出现错误。这些文档显然没有任何指导,除了模糊的暗示它像 Java 一样工作。因此,为什么第一次尝试没有开箱即用如此令人沮丧。
我还尝试在使用 Script > Add …