在另一个常规中包含一个groovy脚本

我读过如何简单地导入另一个groovy脚本中的groovy文件

我想在一个groovy文件中定义通用函数,并从其他groovy文件中调用这些函数。

我知道这将使用Groovy像一个脚本语言,即我不需要类/对象。 我正在尝试像常规技术,可以在groovy做。 所有的variables将从Java断言,我想要在shell中执行groovy脚本。

这可能吗? 有人可以提供一些例子。

evaluate(new File("../tools/Tools.groovy")) 

把它放在脚本的顶部。 这将带来一个groovy文件的内容(只需用你的groovy脚本replace双引号之间的文件名)。

我用一个令人惊讶的类“Tools.groovy”来做这个。

从Groovy 2.2开始,可以使用新的@BaseScript AST转换注释来声明基本脚本类。

例:

文件MainScript.groovy

 abstract class MainScript extends Script { def meaningOfLife = 42 } 

文件test.groovy

 import groovy.transform.BaseScript @BaseScript MainScript mainScript println "$meaningOfLife" //works as expected 

另一种方法是在groovy类中定义函数,并在运行时parsing和添加文件到类path中:

 File sourceFile = new File("path_to_file.groovy"); Class groovyClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(sourceFile); GroovyObject myObject = (GroovyObject) groovyClass.newInstance(); 

我认为最好的select是以groovy类的forms组织实用的东西,将它们添加到classpath中,让主脚本通过import关键字引用它们。

例:

脚本/ DbUtils.groovy

 class DbUtils{ def save(something){...} } 

脚本/ script1.groovy:

 import DbUtils def dbUtils = new DbUtils() def something = 'foobar' dbUtils.save(something) 

运行脚本:

 cd scripts groovy -cp . script1.groovy 

Groovy没有像典型的脚本语言那样的导入关键字,它将会包含另一个文件的内容(在这里暗示: Groovy是否提供了一个包含机制? )。 因为它是面向对象/面向类的性质,所以你必须“玩游戏”来做这种工作。 一种可能性是使所有的实用function都是静态的(因为你说他们不使用对象),然后在执行shell的上下文中执行静态导入。 然后你可以调用这些方法,如“全局函数”。 另一种可能性是在创build你的Shell的时候使用Binding对象( http://groovy.codehaus.org/api/groovy/lang/Binding.html ),并绑定你想要的方法的所有function(这里的缺点是枚举绑定中的所有方法,但也可以使用reflection)。 还有一种解决scheme是重写指派给你的shell的委托对象中的methodMissing(…),这允许你基本上使用地图或任何你喜欢的方法进行dynamic调度。

其中几种方法在这里展示: http : //www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ 。 让我知道如果你想看到一个特定技术的例子。

对于后来者来说,现在groovy似乎支持:load file-path命令,它只是简单地redirect给定文件的input,所以现在包含库脚本是微不足道的。

它作为input到groovysh&作为加载文件中的一行:
groovy:000> :load file1.groovy

file1.groovy可以包含:
:load path/to/another/file invoke_fn_from_file();

我这样做的方式是使用GroovyShell

 GroovyShell shell = new GroovyShell() def Util = shell.parse(new File('Util.groovy')) def data = Util.fetchData() 

@grahamparks和@snowindy的组合可以帮我在Tomcat上运行Groovy脚本:

Utils.groovy

 class Utils { def doSth() {...} } 

MyScript.groovy:

 /* import Utils --> This import does not work. The class is not even defined at this time */ Class groovyClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(new File("full_path_to/Utils.groovy")); // Otherwise it assumes current dir is $CATALINA_HOME def foo = groovyClass.newInstance(); // 'def' solves compile time errors!! foo.doSth(); // Actually works!