服务器上运行Groovy脚本:从安装到定时任务的完整步骤
在服务器上运行 Groovy 脚本,核心就三步:装好 JDK 和 Groovy、用 groovy 命令执行脚本、需要定时执行就配 crontab。
下面按这个顺序展开,命令可以直接复制到终端验证。
先确认 JDK 和系统环境
Groovy 运行在 JVM 上,所以服务器必须先有 JDK。
执行以下命令检查:
java -version
如果提示 command not found,先装 JDK。
以 CentOS 7/8 为例:
yum install -y java-11-openjdk-devel
Ubuntu/Debian 则用:
apt update && apt install -y openjdk-11-jdk
安装完再次执行 java -version,能看到版本号即表示 JDK 就绪。
Groovy 3.x 和 4.x 都兼容 JDK 8 到 17,生产环境建议用 JDK 11 或 17,避免过旧版本缺少安全补丁。
安装 Groovy 的两种方式
方式一:SDKMAN 安装(推荐)
SDKMAN 是 JVM 生态常用的版本管理工具,安装和切换 Groovy 版本都方便:
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install groovy
安装完成后验证:
groovy -version
输出类似 Groovy Version: 4.0.x JVM: 11 就说明成功了。
SDKMAN 装的 Groovy 默认在当前用户目录下,如果用 root 装的,其他用户可能无法直接调用,这点后面避坑部分会讲。
方式二:手动解压安装
如果服务器不能访问外网或不想用 SDKMAN,可以去 Groovy 官网下载二进制包(注意确认最新版本号),上传到服务器后解压:
mkdir -p /opt/groovy
cd /opt/groovy
tar -xzf apache-groovy-binary-*.zip
然后配置环境变量,编辑 /etc/profile.d/groovy.sh:
export GROOVY_HOME=/opt/groovy/groovy-4.0.0
export PATH=$PATH:$GROOVY_HOME/bin
执行 source /etc/profile.d/groovy.sh 后同样用 groovy -version 验证。
手动安装的好处是路径固定,适合多用户共用和写进系统级定时任务。
运行脚本与依赖管理
写一个最简单的脚本 test.groovy:
println "Hello from Groovy on server"
执行:
groovy test.groovy
如果脚本需要第三方库,用 @Grab 注解可以在首次运行时自动下载依赖:
@Grab('org.apache.commons:commons-lang3:3.12.0')
import org.apache.commons.lang3.StringUtils
println StringUtils.reverse("server")
注意:@Grab 依赖 Maven 中央仓库网络,服务器无法访问外网时会报下载失败。
这种情况建议提前用 groovy -cp 指定本地 jar:
groovy -cp /opt/libs/commons-lang3-3.12.0.jar test.groovy
配进 crontab 定时执行
先确认脚本能正常跑,再写定时任务。
执行 crontab -e,添加一行:
0 3 * * * /usr/bin/groovy /opt/scripts/backup.groovy >> /var/log/groovy-backup.log 2>&1
含义是每天凌晨 3 点执行脚本,输出追加到日志文件。
几个关键点:
- 命令路径必须用绝对路径,cron 的 PATH 和登录 shell 不一样,直接写
groovy大概率找不到。用which groovy查到真实路径再填。 - 日志重定向
>> ... 2>&1要加上,否则脚本报错时你什么都看不到。 - 如果脚本依赖环境变量(比如 JAVA_HOME),在 crontab 文件顶部补一行
JAVA_HOME=/usr/lib/jvm/java-11-openjdk。
验证方式:把时间改成下一分钟,观察日志文件是否有输出,确认后再改回目标时间。
容易踩的坑
权限问题:用 root 通过 SDKMAN 装的 Groovy,普通用户执行时会提示找不到命令。
解决办法是手动安装到 /opt 并配置系统级环境变量,或者给每个用户单独安装。
脚本第一行 shebang 写法:如果想让脚本直接 ./test.groovy 执行,文件头写 #!,并
/usr/bin/env groovychmod +x test.groovy。
但 cron 里仍然建议写完整命令,不依赖 shebang。
中文乱码:脚本里有中文输出时,确保文件编码是 UTF-8,并在启动参数加 -Dfile.encoding=UTF-8:
groovy -Dfile.encoding=UTF-8 test.groovy
Groovy 版本与 Java 版本不匹配:Groovy 2.x 不支持 JDK 17,如果服务器装的是新版 JDK,务必用 Groovy 3.0 以上版本。
怎么确认一切正常
按以下清单逐项检查:
java -version和groovy -version都能正常输出版本号。- 手动执行
groovy /opt/scripts/xxx.groovy能跑通,输出符合预期。 - crontab 里的命令用绝对路径,日志重定向已配置。
- 定时任务触发后,日志文件有对应时间戳的输出记录。
- 涉及数据库或 API 调用的脚本,在服务器上先用
curl或telnet确认网络可达。
如果某一步卡住,优先看日志文件的报错信息,再对照上面的避坑部分排查。
Groovy 在服务器上的使用门槛不高,关键是环境变量和定时任务的路径要写对。