本文将介绍groovy
在各种运行环境下的实操,通过实践让你了解到groovy
作为脚本语言的一些使用场景,以针对实际使用情况选择最佳的工具和环境。
笔者相关教程:
Windows平台SDKMAN工具使用
Groovy DSL从入门到项目实战(一)
学习参考资料:
baeldung - Integrating Groovy into Java Applications
PACKT出版的:Groovy for Domain-specific Languages - 第二版英文版 (Dearle, Fergal) - Chapter2 - Groovy Quick Start
文章目录
编写groovy程序
groovy
作为java
语言的扩展,很自然我们可以写出这样最原始的java
程序:
public class HelloGroovy {
public static void main(String [] args) {
System.out.println("Hello, Groovy!");
}
}
程序路径:E:/csdn/groovy/code/00_hello/HelloGroovy.groovy
,注意文件的后缀为.groovy
打开命令终端,进入路径:E:/csdn/groovy/code/00_hello/
,执行:
# .groovy后缀也可省略
groovy HelloGroovy.java
groovy
作为一门脚本语言,无需严格的类结构,可简化为:
println "Hello, Groovy!"
编译运行:groovy SimpleHello
java命令执行
# .groovy后缀可省略 注意引入相应的类库
java -cp D:\Programs\sdkman\candidates\groovy\current\lib\groovy-4.0.22.jar groovy.ui.GroovyMain SimpleGroovy
groovyc方式
先用groovyc
编译,再用java
运行:
groovyc SimpleGroovy.groovy
# 注意,这里的类路径除了指定groovy依赖还有当前编译的class的路径,用的.表示当前路径,路径之间在windows系统中用;在linux中用:
java -cp "D:\Programs\sdkman\candidates\groovy\current\lib\groovy-4.0.22.jar;." SimpleGroovy
命令行运行groovy脚本
# -e 执行groovy语句
groovy -e "println 'Hi, Groovy'"
Shebang脚本
封装这样一个脚本:E:\csdn\groovy\code\02_shell\Hello
:
#!/usr/bin/env groovy
println "Hello, World!!"
第一行是固定写法,指定要使用的工具。下一行开始写groovy
脚本。执行结果:
groovysh
该命令在windows
的powershell
中运行,MSYS2
会因ansi
转义问题报错,练习如下:
注意增加类型声明的将作为本地变量,不能在多个shell
脚本语句间共享。
groovyConsole
这是一个groovy安装时自带的GUI
客户端,输入命令groovyConsole
即可调取出来,练习如下:
idea集成开发环境
下面做一个 jmx监控示例,先用idea
创建项目
待完成自动构建后,创建一个连接jmx
服务测试堆使用情况的groovy
程序monitor.groovy
:
package com.csdn
import java.lang.management.*
import java.lang.management.ManagementFactory as Factory
import javax.management.remote.JMXConnectorFactory as JMX
import javax.management.remote.JMXServiceURL as ServiceURL
def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:3333/jmxrmi'
def server = JMX.connect(new ServiceURL(serverUrl)).MBeanServerConnection
println "堆使用情况: "
def mem = Factory.newPlatformMXBeanProxy(server, Factory.MEMORY_MXBEAN_NAME, MemoryMXBean.class)
def heapUsage = mem.heapMemoryUsage
println """Memory usage : $heapUsage.used"""
mem.gc()
heapUsage = mem.heapMemoryUsage
println """Memory usage after GC: $heapUsage.used"""
准备一个spring boot
的服务器端程序,在application.yml
中启用jmx
:
spring:
jmx:
enabled: true
启动服务前,加vm
参数,指定端口、禁用认证和ssl:
-Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
测试如下:
Java程序中加载groovy脚本
GroovyShell
本示例继续在idea
集成开发环境下开发:
package com.csdn;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
import lombok.SneakyThrows;
public class GroovyShellTest {
@SneakyThrows
public static void main(String[] args) {
GroovyShell groovyShell = new GroovyShell();
// 解析字符串的groovy脚本
Script script = groovyShell.parse("println('Hello Groovy!'); return 'Groovy execution successful!'");
// 返回脚本return的内容
Object obj = (Object) script.run();
System.out.println(obj);
}
}
执行结果:
GroovyClassLoader
示例程序
package com.csdn;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import lombok.SneakyThrows;
import java.io.File;
public class GroovyTest2 {
private static ClassLoader loader = GroovyTest2.class.getClassLoader();
@SneakyThrows
public static void main(String[] args) {
// 使用相同的类加载器,对指定位置的groovy脚本文件进行读取,并实例化为相应的GroovyObject对象,进行方法调用
Class calcClass = new GroovyClassLoader(loader).parseClass(
new File("src/main/resources/", "RuleScript.groovy"));
GroovyObject go = (GroovyObject) calcClass.newInstance();
Object result = go.invokeMethod("execute", null);
System.out.println(result);
}
}
这里有一个简单groovy
脚本文件
class RuleScript {
def execute() {
println("execute rule...")
// 无返回值
}
}
执行结果:
GroovyScriptEngine
这种API
方式感觉逻辑更清晰,看示例:
package com.csdn;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import groovy.util.GroovyScriptEngine;
import lombok.SneakyThrows;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
public class GroovyTest2 {
private static ClassLoader loader = GroovyTest2.class.getClassLoader();
private static GroovyScriptEngine engine;
static {
try {
// 基于脚本所在的目录构建engine对象
engine = new GroovyScriptEngine(new URL[] {new File("src/main/resources/").toURI().toURL()}, loader);
} catch (Exception ignored) {
}
}
@SneakyThrows
public static void main(String[] args) {
// 加载指定脚本
Class<GroovyObject> calcClass = engine.loadScriptByName("RuleScript.groovy");
GroovyObject go = calcClass.newInstance();
Object result = go.invokeMethod("execute", null);
System.out.println(result);
}
}
运行结果同前面的例子。