我正试图通过编程创建一个groovy上下文,并向其中添加多个脚本。
这是一个简化的版本,但它应该解释问题:
test/Helper.groovy
package test
class Helper {
static void help() {
// Do something
}
}
test/Test.groovy
package test
class Test {
static void test() {
Helper.help()
}
}
上下文是用下面的java代码构建的:
public class Runner {
public static void main(String[] args) throws IOException {
GroovyShell shell = new GroovyShell(Runner.class.getClassLoader(), new Binding(), CompilerConfiguration.DEFAULT);
load(shell, "/test/Test.groovy");
load(shell, "/test/Helper.groovy");
}
private static void load(GroovyShell shell, String name) throws IOException {
try(var script = Runner.class.getResourceAsStream(name)) {
String scriptSrc = new String(script.readAllBytes(), StandardCharsets.UTF_8);
shell.parse(scriptSrc, name);
}
}
}
!!!我故意以任意顺序加载脚本。
如果我在本地运行这段代码,一切都很好。
在SAP Commerce(本质上是一个带有spring和其他东西的tomcat)中运行此代码会抛出一个错误:
Caused by: java.lang.reflect.InvocationTargetException
...
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Test.groovy: 5: Apparent variable 'Helper' was found in a static scope but doesn't refer to a local variable, static field or class. Possible causes:
You attempted to reference a variable in the binding or an instance variable from a static context.
You misspelled a classname or statically imported field. Please check the spelling.
You attempted to use a method 'Helper' but left out brackets in a place not allowed by the grammar.
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:292) ~[groovy-2.5.14.jar:2.5.14]
at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:979) ~[groovy-4.0.2.jar:2.5.14]
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:692) ~[groovy-2.5.14.jar:2.5.14]
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:666) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:373) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyClassLoader.lambda$parseClass$2(GroovyClassLoader.java:316) ~[groovy-2.5.14.jar:2.5.14]
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163) ~[groovy-2.5.14.jar:2.5.14]
at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:553) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyShell.parse(GroovyShell.java:566) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyShell.parse(GroovyShell.java:620) ~[groovy-2.5.14.jar:2.5.14]
at groovy.lang.GroovyShell.parse(GroovyShell.java:624) ~[groovy-2.5.14.jar:2.5.14]
由于我们的环境中有更多的groovy脚本,顺便说一下,我们设计了应用程序,所以我无法将它们按正确的顺序排列。
什么会导致groovy出现这种行为?
我不知道像安全经理之类的东西。在Tomcat中启用。
使用groovy 2.5.14测试
1条答案
按热度按时间tvokkenx1#
我建议使用GroovyShell的单例作为上下文,因为解析/编译groovy需要花费大量时间。
如何从Java中正确运行代码:
为groovy类创建文件夹结构:
包名必须对应于某个根文件夹中的一个文件夹,我们要将其添加为类路径。
java代码看起来像这样:
我对SAP不太熟悉,但那里有一个现有的groovy上下文,只需将
"./groovy-root"
文件夹添加到类路径中,就可以了。