Groovy 从另一个方法调用方法会引发java.lang.ClassFormatError:非法类名

Groovy 从另一个方法调用方法会引发java.lang.ClassFormatError:非法类名,groovy,Groovy,使用GroovyScript引擎运行groovy脚本。下面是创建的groovy文件 BasePayCalculation.groovy return calculate() def calculate() { def currentPay = currentPay currentPay = normalize(currentPay); // Current pay cannot be zero if (currentPay == 0) { thr

使用GroovyScript引擎运行groovy脚本。下面是创建的groovy文件

BasePayCalculation.groovy

return calculate()

def calculate() {
    def currentPay = currentPay
    currentPay = normalize(currentPay);
    // Current pay cannot be zero
    if (currentPay == 0) {
        throw new IllegalArgumentException("Current pay is zero")
    }
}


def normalize(def it) {
    if (it == null) 
        return 0
    else
        return it
}
从应用程序运行此命令,获取

java.lang.ClassFormatError: Illegal class name "cds:BasePayCalculation$normalize$0" in class file cds:BasePayCalculation$normalize$0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.define(ClassLoaderForClassArtifacts.java:42)
    at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts$1.run(ClassLoaderForClassArtifacts.java:86)
    at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts$1.run(ClassLoaderForClassArtifacts.java:84)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.defineClassAndGetConstructor(ClassLoaderForClassArtifacts.java:84)
    at org.codehaus.groovy.runtime.callsite.CallSiteGenerator.compilePogoMethod(CallSiteGenerator.java:217)
    at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:228)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:212)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:188)
    at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3122)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:108)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
    at cds:BasePayCalculation.calculate(cds:BasePayCalculation.groovy:20)
    at cds:BasePayCalculation.run(cds:BasePayCalculation.groovy:16)
    at groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:551)
请帮我解决这个问题

以下额外信息:

  • 使用webapplication从tomcat运行
  • Groovy 2.1.1
  • 使用代码运行此命令

    Binding params = new Binding()
    if (context != null) {
      for (String key : context.keySet()) {
        Object param = context.get(key);
        params.setVariable(key, param);
      }
    }
    long time = System.currentTimeMillis();
    Object object = engine.run(name, params);
    
Java版本1.6 tomcat版本6.0.24


提前感谢。

问题在于groovy声明的类与运行的脚本同名,因此脚本名也相同。我想,在这种情况下,问题是“:”字符。

您是如何运行此功能的?(你能发布代码吗?)什么版本的Groovy?使用webapplication从tomcat运行。Groovy 2.1.1。使用“Binding params=new Binding()”运行此命令;if(context!=null){for(String key:context.keySet()){Object param=context.get(key);params.setVariable(key,param);}}}long time=System.currentTimeMillis();Object Object=engine.run(名称,参数);'你能从“你是如何运行的”中再添加一点代码吗?我尝试使用
GroovyShell
运行这个脚本,效果很好。我正在使用groovyscript引擎调用groovy脚本。run(groovyname,bindingparams);让我知道还需要什么信息。Thanks@Raj,你试过/能试着在tomcat外面跑步吗?我用脚本做了一个例子,效果很好。