为何Groovy主类无法从构建的JAR包中执行?
Groovy主类打包成可执行JAR后无法找到的解决方案
这种Groovy主类打包后找不到的问题我之前踩过坑,核心原因其实是Groovy需要专属的运行时支持,而常规Java可执行JAR的打包逻辑默认不会处理这点。先确认下你的代码本身没问题:
你的代码示例
Groovy主类(src/main/groovy/foo/Test.groovy)
package foo public class Test { // public关键字在Groovy中是冗余的,但不影响功能 public static void main(String[] args) { println "groovy world" } }
Java主类(src/main/groovy/foo/Test2.java)
package foo; public class Test2 { public static void main(String[] args) { System.out.println("java world"); } }
Java主类能正常运行,是因为JDK自带了Java的运行时环境;但Groovy是基于JVM的动态语言,必须依赖Groovy运行时库才能执行,而且打包时得确保主类被正确识别、依赖被正确引入。下面给你几种常用的解决方式:
方案1:用Gradle构建(推荐)
Gradle的Groovy插件和Shadow插件能帮你一站式搞定编译、依赖打包和主类配置:
plugins { id 'groovy' id 'com.github.johnrengelman.shadow' version '8.1.1' // 用于打包包含所有依赖的可执行JAR } repositories { mavenCentral() } dependencies { implementation 'org.codehaus.groovy:groovy-all:3.0.17' // 请适配你实际使用的Groovy版本 } shadowJar { mainClassName = 'foo.Test' // 指定Groovy主类的全限定名 }
执行命令./gradlew shadowJar后,在build/libs目录下会生成一个带-all后缀的JAR包,直接运行java -jar 你的项目名-all.jar就能看到groovy world的输出了。
方案2:用Maven构建
Maven需要借助gmavenplus-plugin编译Groovy代码,再用maven-shade-plugin打包依赖并指定主类:
<project> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.17</version> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <!-- 编译Groovy代码 --> <plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.13.1</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <!-- 打包可执行JAR并包含所有依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>foo.Test</mainClass> <!-- 指定Groovy主类 --> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
执行mvn package后,target目录下生成的shaded JAR就是可执行的,直接运行java -jar 你的项目名-版本号.jar即可。
方案3:手动打包(适合调试)
如果是手动用jar命令打包,需要自己处理依赖和Manifest配置:
- 先创建
manifest.mf文件:
Main-Class: foo.Test Class-Path: groovy-all-3.0.17.jar
- 编译Groovy类:
groovyc src/main/groovy/foo/Test.groovy -d classes
- 打包JAR:
jar cvfm test.jar manifest.mf -C classes .
- 运行时要把
groovy-all-3.0.17.jar放在和test.jar同目录,然后执行:
java -jar test.jar
总的来说,核心就是要保证两个点:Groovy主类被正确编译到JAR中,运行时能找到Groovy的运行时依赖。用构建工具的话,插件会帮你处理大部分细节,手动打包就得自己操心这些配置了。
内容的提问来源于stack exchange,提问作者wu-lee
相关产品推荐
相关产品推荐

