Scripting 嵌入式groovy脚本中的作用域

Scripting 嵌入式groovy脚本中的作用域,scripting,groovy,scope,Scripting,Groovy,Scope,在我的应用程序中,我使用Groovy作为脚本语言。为了让我的客户更方便,我有一个全局范围,在其中定义助手类和常量 目前,每次执行用户脚本时,我都需要运行脚本(构建全局范围): context = setupGroovy(); runScript( context, "global.groovy" ); // Can I avoid doing this step every time? runScript( context, "user.groovy" ); 有没有办法设置这个全局范围一次,然

在我的应用程序中,我使用Groovy作为脚本语言。为了让我的客户更方便,我有一个全局范围,在其中定义助手类和常量

目前,每次执行用户脚本时,我都需要运行脚本(构建全局范围):

context = setupGroovy();
runScript( context, "global.groovy" ); // Can I avoid doing this step every time?
runScript( context, "user.groovy" );
有没有办法设置这个全局范围一次,然后告诉嵌入式脚本解释器:“如果找不到变量,请看这里”?这样,我就可以运行一次全局脚本


注意:安全性在这里不是一个问题,但是如果您知道一种确保用户不能修改全局范围的方法,这是一个额外的优点。

不知羞耻地从groovy.codehaus偷来:

为人们提供最完整的解决方案 谁想将groovy脚本嵌入到 他们的服务器,并让他们重新加载 关于修改是最重要的 GroovyScript引擎。初始化 带有一组 类路径一样的根,可以是URL 或目录名。那么你可以 在这些脚本中执行任何Groovy脚本 根。GSE还将跟踪 脚本之间的依赖关系,以便 如果修改了任何依赖脚本 整个树将被重新编译并 重新加载

此外,每次运行 您可以传入的绑定 包含脚本所需的属性 可以访问。中设置的任何属性 脚本也将在该版本中提供 脚本运行后的绑定。在这里 下面是一个简单的例子:

发现:


这样的东西对你有用吗?

不知羞耻地从groovy.codehaus偷来:

为人们提供最完整的解决方案 谁想将groovy脚本嵌入到 他们的服务器,并让他们重新加载 关于修改是最重要的 GroovyScript引擎。初始化 带有一组 类路径一样的根,可以是URL 或目录名。那么你可以 在这些脚本中执行任何Groovy脚本 根。GSE还将跟踪 脚本之间的依赖关系,以便 如果修改了任何依赖脚本 整个树将被重新编译并 重新加载

此外,每次运行 您可以传入的绑定 包含脚本所需的属性 可以访问。中设置的任何属性 脚本也将在该版本中提供 脚本运行后的绑定。在这里 下面是一个简单的例子:

发现:


这样做对您有用吗?

一个简单的解决方案是使用
groovy.lang.GroovyShell
中的代码:您可以像这样预编译脚本:

    GroovyCodeSource gcs = AccessController.doPrivileged( new PrivilegedAction<GroovyCodeSource>() {
        public GroovyCodeSource run() {
            return new GroovyCodeSource( scriptCode, fileName, GroovyShell.DEFAULT_CODE_BASE );
        }
    } );
    GroovyClassLoader loader = AccessController.doPrivileged( new PrivilegedAction<GroovyClassLoader>() {
        public GroovyClassLoader run() {
            return new GroovyClassLoader( parentLoader, CompilerConfiguration.DEFAULT );
        }
    } );
    Class<?> scriptClass = loader.parseClass( gcs, false );

一个简单的解决方案是使用
groovy.lang.GroovyShell
中的代码:您可以像这样预编译脚本:

    GroovyCodeSource gcs = AccessController.doPrivileged( new PrivilegedAction<GroovyCodeSource>() {
        public GroovyCodeSource run() {
            return new GroovyCodeSource( scriptCode, fileName, GroovyShell.DEFAULT_CODE_BASE );
        }
    } );
    GroovyClassLoader loader = AccessController.doPrivileged( new PrivilegedAction<GroovyClassLoader>() {
        public GroovyClassLoader run() {
            return new GroovyClassLoader( parentLoader, CompilerConfiguration.DEFAULT );
        }
    } );
    Class<?> scriptClass = loader.parseClass( gcs, false );
Binding context = new javax.script.Binding();
Script script = InvokerHelper.createScript(scriptClass, context);
script.run();