
Groovy 的 groovy 命令用于直接解释执行 .groovy 脚本,而 groovyc 编译生成的是 JVM 字节码(.class 文件),不可用 groovy 命令运行;应使用 java 命令配合 Groovy 运行时库加载执行。
groovy 的 `groovy` 命令用于直接解释执行 `.groovy` 脚本,而 `groovyc` 编译生成的是 jvm 字节码(`.class` 文件),不可用 `groovy` 命令运行;应使用 `java` 命令配合 groovy 运行时库加载执行。
在 Groovy 开发中,一个常见误区是混淆脚本执行与字节码执行的机制。当你编写 Hello.groovy 并执行 groovyc Hello.groovy 时,Groovy 编译器会将其编译为标准 JVM 字节码(即 Hello.class),但该类并非普通 Java 类——它继承自 groovy.lang.Script,并依赖 Groovy 运行时(如 groovy-*.jar)提供核心支持(例如动态方法分发、AST 变换、println 的重载实现等)。因此,直接运行 groovy Hello.class 会导致解析失败:groovy 命令期望读取的是源码文本(.groovy 文件),而非二进制字节码,从而报出类似 Unexpected character: '' 的错误。
✅ 正确做法分两种场景:
-
快速运行脚本(推荐入门方式):
直接使用groovy命令解释执行源文件,无需编译:groovy Hello.groovy # 输出:Hello, Groovy!
-
运行编译后的 class 文件(需显式指定类路径):
若已用groovyc编译,须通过java命令启动,并确保groovy-x.x.x.jar在类路径(-cp)中,且不带.class后缀(仅写类名):# 查找 Groovy 安装路径下的 JAR(Ubuntu 下通常位于 /usr/share/groovy/lib/) java -cp "/usr/share/groovy/lib/groovy-4.0.11.jar:." Hello
⚠️ 注意:
-
.表示当前目录(含Hello.class); - Groovy JAR 路径需根据实际安装版本调整(可用
groovy -version和groovy -e 'println System.getProperty("groovy.home")'辅助定位); - 不要写
Hello.class,Java 启动时只需类名Hello(JVM 自动查找Hello.class)。
-
? 补充说明:Groovy 的 groovy CLI 本质是封装了 java -cp ... org.codehaus.groovy.tools.GroovyStarter,它内置了对 .groovy 源码的解析与即时编译(JIT compilation),因此天然支持脚本模式;而 groovyc 是纯编译工具,输出与 Java javac 类似,但语义依赖 Groovy 运行时——这正是二者不可混用的根本原因。
总结:开发初期优先使用 groovy *.groovy;仅当需要与 Java 项目集成、或做性能基准测试时,才使用 groovyc + java 流程,并务必管理好 Groovy 运行时依赖。

















