java Groovy无法解析其他Groovy文件中的类

xxhby3vn  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(216)

我正试图通过编程创建一个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测试

tvokkenx

tvokkenx1#

我建议使用GroovyShell的单例作为上下文,因为解析/编译groovy需要花费大量时间。
如何从Java中正确运行代码:
为groovy类创建文件夹结构:

/groovy-root
  /test
    Helper.groovy
    Test.groovy

包名必须对应于某个根文件夹中的一个文件夹,我们要将其添加为类路径。
java代码看起来像这样:

import groovy.lang.GroovyShell;

public class A{
    public static void main(String[] args) {
        GroovyShell shell = new GroovyShell(A.class.getClassLoader());
        shell.getClassLoader().addClasspath("./groovy-root");
        // this line will load all required classes to execute script
        shell.evaluate("test.Test.test()"); 
    }
}

我对SAP不太熟悉,但那里有一个现有的groovy上下文,只需将"./groovy-root"文件夹添加到类路径中,就可以了。

相关问题