运行Groovy代码
运行Groovy代码,有两种方法:
-
直接使用
groovy filename
命令,它会在内存中直接编译代码运行,而不会生成什么编译文件。
假设在桌面上有一个名为hello.groovy
文件:/*======hello.groovy==========*/ def prompt="Press your name:" def console=System.console() def name=new String(console.readLine(prompt,null)) for (;name=="";name=new String(console.readLine(prompt,null))){ println "input can't be empty"; } println "hello! Mr.$name"
则在命令行中(切换到所在目录):
C:\Users\Berlin\Desktop>groovy hello Press your name: input can't be empty Press your name:Andrew hello! Mr.Andrew C:\Users\Berlin\Desktop>
-
使用
groovyc
命令(类似javac
命令)将其显式的编译为.class
文件,然后使用java
命令运行。
这里有几点需要注意:- 因为没有包声明,则使用
groovyc
命令时可以用-d
来指定.class
文件的输出路径。 - 使用
java
命令运行时,要将%GROOVY_HOME%\embeddable\groovy-all-2.4.12.jar
这个包加入-classpath
类搜索路径中去,其中%GROOVY_HOME%
是安装Groovy时的环境变量,在我的机器上是C:\Program Files\Groovy\groovy-2.4.12
。 - 有一个点请注意,上面命令不能直接写为
java -classpath %GROOVY_HOME%\embeddable......
,这是因为展开后就变成了java -classpath C:\Program Files\Groovy\groovy-2.4.12\embeddable......
,因为其中包括一个空格(C:\Program Files
)从而会将C:\Program
认为是一个路径,解决办法是使用双引号括起来:java -classpath "%GROOVY_HOME%\embeddable......" .....
-
java -classpath
后面如果依赖多个路径,将路径用分号分隔 -
java
命令最后跟要运行的class
文件,但是有时会出现“无法加载类或找不到主类”的错误提示,一个解决办法是,将class
文件所在路径加入到-classpath
的路径中去。
作为例子,展示一个使用拓展模块定制自己的拓展方法。
在Groovy中可以给一个类添加拓展方法,既可以是实例方法(其中有this指针)也可以是静态方法。这分为两步:- 首先,将所有方法放入一个包装类中,但是必须都声明为(该包装类的)静态方法。而这个方法(对于被拓展类)到底是实例方法还是静态方法要在清单文件中设置。这些方法,第一个参数是被拓展类类型,尔后的参数都是要传入这个方法的参数。事实上,可以想象其中的调用原理,例如在
StringExtension
包装类中拓展一个String方法,作用是将字符串全部转为大/小写并打印:def static unifyFormatAndPrint(String str,boolean isUppercase)
,调用时"hello Bob".unifyFormatAndPrint(true)
,内部实际上是StringExtension.unifyFormatAndPrint("hello Bob",true)
。当然如果是一个(对被拓展类而言的)静态方法,则第一个参数就没有用了(当然必须得有)。
这个文件如下所示://MyStringExtension.groovy class StringExtension{ def static unifyFormatAndPrint(String str,boolean isUppercase){ if(isUppercase) println str.toUpperCase() else println str.toLowerCase() } }
- 接下来在清单文件中声明其存在,在任意位置建一个文件夹,在该文件夹下放置如下的目录结构:
新建文件夹/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
在其中做如下声明:moduleName=string_extension //自己制定的模块名 moduleVersion=1.0-SNAPSHOT //自己制定的版本号 extensionClasses=StringExtension //逗号分隔的实例方法所在的包装类 //extensionStaticClasses=..... //逗号分隔的实例方法所在的包装类
- 使用
groovyc
命令将文件先编译:
- 然后使用
jar
命令生成jar包
其中-cf
后指定输出的包名,-C classes . -C 新建文件夹 .
表示到暂时切换到该目录下(注意不是-c
),后面的点号(.
)表示在当前目录下搜索。 - 下面开始使用这个包,新建一个Groovy文件:
使用groovyc编译,//use.groovy "hello Bon".unifyFormatAndPrint(true)
groovyc -d classes use.groovy
然后使用java
命令开始运行,注意上面提到的注意事项:
java -classpath "%GROOVY_HOME%\embeddable\groovy-all-2.4.12.jar";ext.jar;classes use
【需要用到groovy-all-2.4.12.jar包以及刚才自己定义的拓展方法包ext.jar,以及class文件路径classes。注意!!分号后面不要留空格!;ext.jar;classes
不能写成; ext.jar; classes
】
- 因为没有包声明,则使用
网友评论