groovy各种运行环境实操

本文将介绍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

该命令在windowspowershell中运行,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);
    }
}

运行结果同前面的例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值