Apache Groovy 配置参数详解
梳理 Apache Groovy 配置:GROOVY_HOME/JAVA_OPTS、-cp/-D/--configscript 参数、GroovyConfig、Grape 依赖、groovysh/@CompileStatic、内存调优。
Apache Groovy 配置参数详解
Groovy 的配置可归纳为四层:进程环境变量、命令行参数、编译配置脚本(--configscript / withConfig)以及依赖解析配置(Grape)。本文结合 Ubuntu 22.04 与 CentOS 8 上的真实回显逐一说明。
一、环境变量
1.1 GROOVY_HOME
GROOVY_HOME 指向 Groovy 安装根目录,启动脚本据此定位 lib/、conf/ 与 bin/。
# export GROOVY_HOME=/opt/groovy
# ls $GROOVY_HOME
bin conf lib LICENSE NOTICE
1.2 JAVA_HOME 与 PATH
Groovy 由启动脚本调用 $JAVA_HOME/bin/java,因此 JAVA_HOME 决定实际运行的 JDK 版本;PATH 需包含 $GROOVY_HOME/bin。
# export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # CentOS: /usr/lib/jvm/java-11-openjdk
# export PATH=$GROOVY_HOME/bin:$JAVA_HOME/bin:$PATH
# groovy --version
Groovy Version: 4.0.24 JVM: 11.0.32.1 Vendor: Ubuntu OS: Linux
1.3 JAVA_OPTS
JAVA_OPTS 会被追加到 JVM 启动参数中,适合设置堆大小、时区、编码等。实测验证堆上限生效:
# JAVA_OPTS="-Xmx512m" groovy -e 'println((Runtime.runtime.maxMemory()/1024/1024) as int)'
512
二、groovy 启动参数
2.1 -cp / -classpath
指定脚本运行所需的额外类路径,注意必须作为第一个参数:
# groovy -cp /opt/libs/app.jar /root/app.groovy
2.2 -D / --define
向 JVM 注入系统属性,脚本中通过 System.getProperty 读取:
# groovy -Dapp.env=prod -e 'println System.getProperty("app.env")'
prod
2.3 --configscript
指定编译配置脚本,对本次编译全局生效。创建一个全局启用静态编译的配置脚本 config.groovy:
withConfig(configuration) {
ast(groovy.transform.CompileStatic)
}
应用该配置:
# groovy --configscript=/root/config.groovy -e 'int r = 0; for (i in 1..3){ r += i }; println "sum=" + r'
sum=6
2.4 -J 与相关选项
groovyc 支持 -J=<property=value> 将属性透传给底层 javac(联合编译场景),以及 -pa(保留方法参数名元数据)、-pr(启用预览特性)。示例:
# groovyc -J=source=11 -d /root/classes /root/mix/*.groovy /root/mix/*.java
三、GroovyConfig 与 groovy.properties
3.1 withConfig 编译配置
在 --configscript 或自定义 Builder 中使用 withConfig(configuration){...} 调整 CompilerConfiguration,例如开启 invokedynamic、追加全局 AST 转换:
withConfig(configuration) {
configuration.optimizationOptions.indy = true
}
3.2 ConfigSlurper 读取分层配置
groovy.util.ConfigSlurper 可将 Groovy 风格的分层配置解析为对象:
def slurper = new groovy.util.ConfigSlurper()
def cfg = slurper.parse('''
app {
name = 'groovy-app'
threads = 8
debug = true
db { url = 'jdbc:mysql://127.0.0.1:3306/demo'; pool = 10 }
}
''')
println "app.name = ${cfg.app.name}"
println "app.db.url = ${cfg.app.db.url}"
真实回显:
app.name = groovy-app
app.threads = 8
app.debug = true
app.db.url = jdbc:mysql://127.0.0.1:3306/demo
app.db.pool = 10
四、Grape/Ivy 依赖解析与 @GrabConfig
4.1 @Grab
在脚本顶部用 @Grab 声明依赖,Groovy 会在编译期通过 Grape(内嵌 Ivy)解析并缓存 jar:
@Grab('org.apache.commons:commons-lang3:3.14.0')
import org.apache.commons.lang3.StringUtils
println StringUtils.reverse('apache')
真实回显:
# groovy /root/grab.groovy
trim = [groovy grab]
reverse= barg yvoorg
cap = Apache
4.2 @GrabConfig
当需要控制系统类加载器(如 JDBC 驱动、java.sql 服务发现)时使用:
@GrabConfig(systemClassLoader = true)
@Grab('org.postgresql:postgresql:42.7.3')
import org.postgresql.Driver
println Driver.name
4.3 缓存与镜像
- 缓存目录:
~/.groovy/grapes。 - 私有仓库:通过
@GrabResolver(name='nexus', root='https://nexus.example.com/repository/maven-public/')指定。 - CLI 管理:
grape install/grape list/grape resolve(详见《Apache Groovy 常用 CLI 命令与工具详解》)。
五、groovysh 配置
5.1 常用参数
-q:安静模式,抑制多余提示。-D:注入系统属性。-e <code>:进入会话前先执行一段代码。-cp:追加类路径。-T <TYPE>:指定终端类型。
5.2 启动目录约束(重要)
groovysh 启动时会对类路径当前目录递归扫描包名。若在根目录 / 启动会陷入长时间扫描(CPU 满载且无输出)。务必在业务目录中启动:
# mkdir -p /opt/groovy-work && cd /opt/groovy-work
# groovysh
Groovy Shell (4.0.24, JVM: 11.0.32.1)
groovy:000> :help
5.3 变量作用域
在 groovysh 中,def x = ... 定义的是单条求值的局部变量,不跨行保留;需要跨行复用请使用 x = ...:
groovy:000> m=[a:1,b:2]
===> [a:1, b:2]
groovy:000> m.collect{ k,v -> k.toUpperCase()+v }.join(",")
===> A1,B2
六、@CompileStatic 与 @TypeChecked
6.1 命令行开关
# groovy --compile-static -e 'int add(int a,int b){a+b}; println add(3,4)'
7
6.2 @TypeChecked 静态类型检查
# groovy --type-checked -e 'int n = "not-a-number"'
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
script_from_command_line: 1: [Static type checking] - Cannot assign value of type java.lang.String to variable of type int
@ line 1, column 9.
int n = "not-a-number"
^
6.3 注解用法
import groovy.transform.CompileStatic
import groovy.transform.TypeChecked
@CompileStatic
class Calculator {
int add(int a, int b) { a + b }
}
@CompileStatic 在编译期生成静态分派字节码,性能接近原生 Java;@TypeChecked 仅做类型校验而不改变分派方式。
七、内存与 JVM 参数
7.1 堆内存
通过 JAVA_OPTS 控制堆区间,脚本类场景建议 256–512 MB:
# JAVA_OPTS="-Xms256m -Xmx512m" groovy -e 'println((Runtime.runtime.maxMemory()/1024/1024) as int)'
512
7.2 元空间与 GC
# export JAVA_OPTS="-Xmx512m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC"
7.3 编码与随机源
# export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
7.4 关闭 Java 模块告警
在 JDK 16+ 上运行 Groovy 会提示模块访问告警,可设置:
# export GROOVY_TURN_OFF_JAVA_WARNINGS=true