gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:48:23 25 4
gpt4 key购买 nike

背景:

我最近开始使用 Groovy,并尝试在 Eclipse 插件中嵌入 Groovy 脚本引擎,以便让我的客户在我的基于 Eclipse 的产品中开发他们自己的 GUI 扩展。这与success story非常相似。发布在 codehaus 的网站上。

问题

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

BUG! Queuing new source whilst already iterating. Queued source is 'file:/home/nicolas/workspace/groovy-test/src/gui/SwtGuiBuilder.groovy'

问题

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

一些观察:

  • 当使用 groovy 解释器而不是 GroovyScriptEngine java 对象时,我使用 SwtGuiBuilder 类没有问题(请参阅下面的脚本“main_groovy”)。

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

  • 两个报告的常规错误 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_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
}
}

main_groovy.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

// ... 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” 在 org.codehaus.groovy.control.CompilationUnit.addSource(CompilationUnit.java:460) 在 org.codehaus.groovy.control.CompilationUnit.addSource(CompilationUnit.java:433) 在 groovy.util.GroovyScriptEngine$ScriptClassLoader$3.findClassNode(GroovyScriptEngine.java:195) 在 org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:124) 在 org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:863) 在 org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:377) 在 org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1407) 在 org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:202) 在 org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:713) 在 org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:1015) 在 org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:647) 在 org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:596) 在 groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:279) 在 groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:258) 在 groovy.util.GroovyScriptEngine$ScriptClassLoader.doParseClass(GroovyScriptEngine.java:247) 在 groovy.util.GroovyScriptEngine$ScriptClassLoader.parseClass(GroovyScriptEngine.java:229) 在 groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:244) 在 groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:202) 在 groovy.util.GroovyScriptEngine.loadScriptByName(GroovyScriptEngine.java:514) 在 groovy.util.GroovyScriptEngine.createScript(GroovyScriptEngine.java:564) 在 groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:551)

我的配置:

  • Linux Ubuntu 14.04 x86

  • Groovy 版本:2.3.2

  • JVM:1.7.0_55

  • Eclipse Kepler SR2 - 内部版本 20140224-0627

  • Eclipse Groovy 插件 v2.0.7

最佳答案

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

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

def result = new GroovyShell(binding, config).evaluate("""
def foo='bar'
""")

关于java - GroovyScriptEngine 无法加载正在运行的 groovy 脚本的导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com