我正试图通过动态加载源文件为我的用户提供一种方法来为主要的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)
如何保持脚本编写而不编译?这甚至可能吗?
答案 0 :(得分: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调用逻辑的脚本。