[英]Failure to load properly Groovy library into Groovy shell executing script
我的軟件使用 groovy.lang Java 包從 shell 執行 Groovy 腳本,將腳本中的變量綁定到 Java 對象。
典型的腳本如下所示:
package packagename
// import Java classes
abstract class MyClass extends Script {
def myfunction() {
}
}
在這個例子中,'myfunction' 將從外部調用。
腳本(位於文件系統中)按以下順序從 Java 加載 - 代碼返回 GroovyShell 類實例:
GroovyClassLoader groovyClassLoader = new GroovyClassLoader(...)
File groovyFile = new File(groovyURL.toURI());
Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
CompilerConfiguration groovyConfig = new CompilerConfiguration();
groovyConfig.setScriptBaseClass(groovyClass.getName());
return new GroovyShell(groovyClassLoader, new Binding(), groovyConfig);
我的設計目標是添加一個可以在腳本之間共享的 Groovy 庫我的偏好是實現一個類(在現有腳本中添加行似乎是一種黑客行為)。
我做了一個簡單的類來表示庫代碼。 現在,它看起來像:
package shared
class MySharedLib
{
static def testFunction()
{
return "test";
}
}
為了確保它加載的類,我添加了一個調用
groovyClassLoader.parseClass(groovyLibraryFile)
在通過以下方式加載實際腳本之前:
groovyClassLoader.parseClass(groovyFile);
現在,從腳本中,我可以調用庫:
shared.MySharedLib.testFunction()
確實返回字符串“test”。
但是,當嘗試通過以下方式進行導入時:
import shared.MySharedLib
在腳本中(在類定義之前) - 加載腳本時我總是遇到錯誤:
Exception in thread "main" org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
script754084858.groovy: 14: unable to resolve class shared.MySharedLib
@ line 14, column 1.
試圖修改類路徑,它沒有幫助。 我意識到我的設置有問題。 將欣賞如何以正確的方式加載 Groovy 庫的任何提示。
最大限度
感謝您的評論。 我想我明白原因了。 事實證明,在某些時候,“腳本”正在使用
GroovyClassLoader classLoader = new GroovyClassLoader(parentClassLoader);
GroovyCodeSource codeSource = new GroovyCodeSource(code, scriptClassName + ".groovy", "/groovy/script");
CompilationUnit cu = new CompilationUnit(classLoader);
cu.addSource(codeSource.getName(), codeSource.getScriptText());
cu.compile(CompilePhase.CLASS_GENERATION.getPhaseNumber());
到達“import”語句時編譯失敗,因為庫類不在類路徑中,因此無法訪問。
使用適當的路徑調用classLoader.addClasspath(path)可以解決該問題。 所以問題與編譯有關 - 與執行無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.