You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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配置:

  1. 先创建manifest.mf文件:
Main-Class: foo.Test
Class-Path: groovy-all-3.0.17.jar
  1. 编译Groovy类:
groovyc src/main/groovy/foo/Test.groovy -d classes
  1. 打包JAR:
jar cvfm test.jar manifest.mf -C classes .
  1. 运行时要把groovy-all-3.0.17.jar放在和test.jar同目录,然后执行:
java -jar test.jar

总的来说,核心就是要保证两个点:Groovy主类被正确编译到JAR中,运行时能找到Groovy的运行时依赖。用构建工具的话,插件会帮你处理大部分细节,手动打包就得自己操心这些配置了。

内容的提问来源于stack exchange,提问作者wu-lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:02:16