首页 文章

如何在动态加载的groovy文件中使用import

提问于
浏览
1

我试图为我的用户提供一种方法,通过动态加载他们的源文件来为主要的groovy应用程序提供插件 . 但他们的groovy文件包含import语句,我不知道如何使它们工作,即使有一个明显好的类路径 .

主应用程序是shell脚本bin / top.sh:

#!/bin/bash
groovy-2.4.1/bin/groovy -cp lib lib/Top.groovy

lib / Top.groovy类:

public class Top {
  public static void main(String[] args) {
    ClassLoader parent = getClass().getClassLoader()
    GroovyClassLoader loader = new GroovyClassLoader(parent)
    Class groovyClass = loader.parseClass(new File("UserPlugin.groovy"))
    GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance()
    groovyObject.invokeMethod("run",args)
  } 
}

用户类UserPlugin.groovy:

// The following import can be found in the classpath
// passed by the shell script (under lib/, next to Top.groovy)
import Lib

class UserPlugin {
  def UserPlugin() {
    Lib lib = new Lib()
  }
  def run(String [] args) {
    println("Running with: "+args)
  }
}

和lib / Lib.groovy:

class Lib {
  def Lib() {
    println("Lib")
  }
}

当我使用 bin/top.sh 运行时,我得到: UserPlugin.groovy: 3: unable to resolve class Lib

当我将 lib 添加到像 loader.addClasspath('lib') 这样的类加载器时,它是相当灾难性的:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during class generation: java.lang.NoClassDefFoundError: groovy/lang/GroovyObject

java.lang.RuntimeException: java.lang.NoClassDefFoundError: groovy/lang/GroovyObject
    at org.codehaus.groovy.control.CompilationUnit.convertUncaughtExceptionToCompilationError(CompilationUnit.java:1088)

如何在保持脚本编写而不编译的情况下工作?这有可能吗?

1 回答

  • 0

    抱歉,我没有时间找到错误,但我认为问题在于上下文类加载器的设置 . GroovyShell.run会为您解决这个问题,我建议您复制该代码 .

    Top.groovy

    public class Top {
            public static void main(String[] args) {
                new GroovyShell().run(new File("UserPlugin.groovy"), args)
            }
        }
    

    如果你愿意使用Top.groovy脚本而不是类,那么你可以这样做:

    Top.groovy

    run(new File("UserPlugin.groovy"), args)
    

    然后,UserPlugin.groovy需要是一个类(使用main方法)或使用标准Groovy调用逻辑的脚本 .

相关问题