簡體   English   中英

未能將 Groovy 庫正確加載到 Groovy shell 執行腳本中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM