当前位置: 首页 > 知识库问答 >
问题:

GroovyScriptEngine无法加载正在运行的groovy脚本的导入

楚丰羽
2023-03-14

背景:

我最近开始玩Groovy,并试图在eclipse插件中嵌入groovy脚本引擎,让我的客户在我基于eclipse的产品中开发自己的GUI扩展。这与codehaus网站上发布的成功故事非常相似。

问题

当尝试加载groovy类(“SwtGuBuilder”)时,Groovy脚本(让我们称之为“main_eclipse.groovy”)从GroovyScriptEngine抛出的eclipse插件运行,并出现以下错误:

BUG!在已经迭代的同时排队新源代码。排队的源代码是'file:/home/nicolas/workspace/groovy-test/src/gui/SwtGuiBuilder.groovy'

问题

有人遇到同样的问题吗?如何修复?任何帮助都将不胜感激!

一些观察:

>

我的问题似乎不是类路径问题,因为抛出的异常中提到了包含SwtGuiBuilder类的文件。

错误消息在两个报告的groovy错误中提到,GRECLIPSE-429和GRECLIPSE-1037。我没有完全了解技术细节,但这些错误似乎与加载大量类时的性能问题有关,这与我的情况无关......

细节

SampleView。Java语言

public class SampleView
{
public SampleView() { super(); }

public void createPartControl(Composite parent) 
{
    String    groovyScript = null;
    String [] groovyPath   = null;

    boolean shall_exit = false;
    do
    {      // ask user for params
        GroovyLocationDialog groovyLocationDialog= new GroovyLocationDialog(parent.getShell() );
        int return_code = groovyLocationDialog.open();
        if ( return_code != Window.OK )
            shall_exit = true;
        else 
        {
            groovyScript= groovyLocationDialog.getInputScriptName();
            groovyPath  = groovyLocationDialog.getInputScriptPath();

            // run it
            ScriptConnector scriptConnector = new ScriptConnector(parent);
            try                 { scriptConnector.runGuiComponentScript( groovyPath, groovyScript); }
            catch (Exception e) { e.printStackTrace(); }
            System.out.println("script finished");
        }
    }
    while ( ! shall_exit );
}

ScriptConnector.java

public class ScriptConnector
{
    private String[]  roots;
    private Composite window;
    private Binding   binding;

    public ScriptConnector( Composite window )
    {
         this.window    = window;
         Binding  scriptenv = new Binding();    // A new Binding is created ...
         scriptenv.setVariable("SDE", this); 
         scriptenv.setVariable("WINDOW", this.window); // ref to current window

         this.binding = scriptenv;
    }

    public void runGuiComponentScript(final String[] groovyPath, final String scriptName) 
    {
        GroovyScriptEngine gse = null;
        this.roots     = groovyPath;
        try 
        {
            // instanciating the script engine with current classpath
            gse = new GroovyScriptEngine( roots, this.getClass().getClassLoader() );
            gse.run(scriptName, binding);      // ... and run specified script
        }
        catch (Exception e) { e.printStackTrace(); }
        catch (Throwable t) { t.printStackTrace(); }
    }
}

main\u eclipse。groovy公司

package launcher;

import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.*
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.RowLayout as Layout

// This import will fail...
import gui.SwtGuiBuilder;


WINDOW.layout = new Layout(SWT.VERTICAL);
def builder = new SwtGuiBuilder(WINDOW);
builder.Label ( style=SWT.NONE, text = 'Simple demo of Groovy and SWT')
builder.Button( style=SWT.PUSH, text = 'Click me' , action = { println "Click !" } )

SwtGuiBuilder。groovy公司

package gui;

import org.eclipse.swt.events.*
import org.eclipse.swt.widgets.Button
import org.eclipse.swt.widgets.Composite
import org.eclipse.swt.widgets.Label


class SwtGuiBuilder
{
    private Composite _parent

    public SwtGuiBuilder(Composite parent) { _parent = parent }

    public void Button( style = SWT.PUSH, text= null, action = null )
    {
        def btn = new Button(_parent, style)
        if ( text != null )
            btn.text = text
        if (action != null)
            btn.addSelectionListener( new SelectionAdapter() { void widgetSelected( SelectionEvent event ) { action(); } } );
    }

    public void Label( style = SWT.NONE, text = '' )
    {
        def lbl = new Label(_parent, style)
        lbl.text = text
    }
}
package launcher;

import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.*
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.RowLayout as Layout

// ... But this import is handled properly !
import gui.SwtGuiBuilder;

def display = new Display()
def WINDOW = new Shell(display)
WINDOW.text = 'Groovy / SWT Test';

WINDOW.layout = new Layout(SWT.VERTICAL);
def builder = new SwtGuiBuilder(WINDOW);
builder.Label ( style=SWT.NONE, text = 'Simple demo of Groovy and SWT')
builder.Button( style=SWT.PUSH, text = 'Click me' , action = { println "Ya clicked me !" } )

WINDOW.pack();
WINDOW.open();

while (!WINDOW.disposed) {
    if (!WINDOW.display.readAndDispatch())
        WINDOW.display.sleep();
}

堆栈跟踪

缺陷!正在对新源进行排队,同时已进行迭代。排队的源代码是“file:/home/nicolas/workspace/groovy-test/src/gui/SwtGuiBuilder”。groovy’at org。科德豪斯。非常棒。控制编译单元。addSource(CompilationUnit.java:460)位于org。科德豪斯。非常棒。控制编译单元。groovy上的addSource(CompilationUnit.java:433)。util。GroovyScriptEngine$ScriptClassLoader$3。位于org的findClassNode(GroovyScriptEngine.java:195)。科德豪斯。非常棒。控制ClassNodeResolver。org上的resolveName(ClassNodeResolver.java:124)。科德豪斯。非常棒。控制ResolveVisitor。resolveToOuter(ResolveVisitor.java:863)位于org。科德豪斯。非常棒。控制ResolveVisitor。在org上解析(ResolveVisitor.java:377)。科德豪斯。非常棒。控制ResolveVisitor。org上的visitClass(resolveisitor.java:1407)。科德豪斯。非常棒。控制ResolveVisitor。org上的startResolving(resolveisitor.java:202)。科德豪斯。非常棒。控制编译单位1美元。请致电org(CompilationUnit.java:713)。科德豪斯。非常棒。控制编译单元。applyToSourceUnits(CompilationUnit.java:1015)位于org。科德豪斯。非常棒。控制编译单元。doPhaseOperation(CompilationUnit.java:647)位于org。科德豪斯。非常棒。控制编译单元。在groovy上编译(CompilationUnit.java:596)。lang.GroovyClassLoader。groovy上的doParseClass(GroovyClassLoader.java:279)。lang.GroovyClassLoader。groovy上的parseClass(GroovyClassLoader.java:258)。util。GroovyScriptEngine$ScriptClassLoader。groovy上的doParseClass(GroovyScriptEngine.java:247)。util。GroovyScriptEngine$ScriptClassLoader。groovy上的parseClass(GroovyScriptEngine.java:229)。lang.GroovyClassLoader。groovy上的parseClass(GroovyClassLoader.java:244)。lang.GroovyClassLoader。groovy上的parseClass(GroovyClassLoader.java:202)。util。GroovyScript引擎。groovy上的loadScriptByName(GroovyScriptEngine.java:514)。util。GroovyScript引擎。groovy上的createScript(GroovyScriptEngine.java:564)。util。GroovyScript引擎。运行(GroovyScriptEngine.java:551)

我的配置:

>

Groovy版本:2.3.2

JVM:1.7。0_55

Eclipse KeplerSR2-构建20140224-0627

Eclipse Groovy插件v2.0.7

共有1个答案

姬高扬
2023-03-14

我没有使用GroovyScriptEngine,而是使用GroovyShell类(下面是groovy代码,但很容易改回java),CompilerConfiguration允许您指定类路径。

    def config = new CompilerConfiguration(classpath: classpath)
    def binding = new Binding()

    def result = new GroovyShell(binding, config).evaluate("""
def foo='bar'
""")
 类似资料:
  • 无法加载脚本。确保您正在运行Metro(运行“npx react native start”)或捆绑包“index.android”。捆绑包”已正确打包以供发布。屏幕截图 我在windows中运行react原生应用程序时遇到了这个问题,使用android studio,我已经通过android studio连接了我的真实设备来运行usb请帮助 项目文件

  • 我想在gradle在Android中构建debug apk之前运行一些groovy脚本。 将此添加到Build.Gradle(应用程序) 将此添加到build.grade(android) 依赖关系{...classpath“org.codehaus.groovy:gradle-groovy-android-plugin:0.3.6”} 我一直收到错误:错误:原因:错误=13,拒绝权限 更新: 在

  • 当我尝试npx npx react-native run-android时,我坚持了这个错误

  • 我正在使用Netbeans 7.4。我使用glassfish服务器创建了一个新的web项目。现在我喜欢在其中使用groovy脚本。但问题是groovy代码没有在那里进行解释。其输出与代码相同。 它应该给输出Hello Barun!但不是给我输出def name='Barun'println“Hello$name!” 我还将最新的groovy-all jar文件包含到我的项目库中。但是还没有运气。我

  • 我想将一些常见的阶段移动到groovy文件中,以便其他Jenkinsfile可以使用这些阶段而不必复制它们。 我遇到了一些管道很好地加载groovy文件的问题,但当它使用groovy文件中的函数时,会弹出异常。 这是示例代码,我在jenkins配置中使用管道脚本,而不是在SCM的Jenkinsfile中使用。 和groovy文件。

  • 目前,我有一个“包罗万象”的jenkinsfile,其中包含各种函数。为了在其他jenkinsfile中重用这些函数,我想将它们放在单独的groovy脚本中,并从jenkinsfile中加载它们。 scmHandler。groovy: 在jenkinsfile中,我执行以下操作: <代码>。。。def scmHandler=负载(“测试/scmHandler.groovy”)scmHandler。