我正在尝试从 Java 执行一个 groovy 脚本。这是我正在尝试做的事情:
public class ScriptExecutor{
private ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
public CompiledScript compileScript(String language, String script){
Preconditions.checkNotNull(language, "language parameter cannot be null");
Preconditions.checkNotNull(script, "script parameter cannot be null");
try{
ScriptEngine scriptEngine = getScriptEngine(language);
if (scriptEngine instanceof Compilable) {
Compilable compilable = (Compilable) scriptEngine;
return compilable.compile(script);
}else{
throw new AppException("Passed script can not be compiled!");
}
} catch (ScriptException e){
LOGGER.error("[UNABLE TO COMPILE SCRIPT: ] ", e);
throw new AppException("[UNABLE TO COMPILE SCRIPT: ] ", e);
}
}
public static void main(String[] args) {
ScriptExecutor executor = new ScriptExecutor();
String script = "def notnull(Object givenValue){String strValue = obj != null ? obj.toString() : null;return strValue == null;}";
CompiledScript compiledScript = executor.compileScript("groovy", script);
ScriptEngine engine = compiledScript.getEngine();
Invocable invocable = (Invocable)engine;
try {
invocable.invokeFunction("notnull", "test");
} catch (Exception e) {
e.printStackTrace();
}
}
}
在执行此操作时,我收到以下错误:
java.lang.NoSuchMethodException: No signature of method: org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.notnull() is applicable for argument types: (java.lang.String) values: [test]
Possible solutions: notify(), notifyAll(), compile(java.lang.String)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeImpl(GroovyScriptEngineImpl.java:396)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeFunction(GroovyScriptEngineImpl.java:192)
at com.adaequare.processing.script.execution.ScriptExecutor.main(ScriptExecutor.java:188)
有什么我在这里想念的吗?请建议。