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

Gradle构建Jar无法运行:找不到或无法加载主类Main

排查与解决JVM找不到主类的问题

结合你的描述和配置,以下是几个可能的原因和对应的解决方法:

1. Gradle版本更新导致的配置行为变化

如果你的Gradle自动升级到了7.x及以上版本,configurations.runtimeClasspath的解析逻辑可能发生了变化,导致打包时依赖与自身类的路径冲突。可以尝试调整Jar任务的依赖打包方式:

jar {
    duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
    manifest {
        attributes "Main-Class": "Main" // 注意这里要和实际类的全限定名一致,有包的话要加包名,比如com.example.Main
    }

    // 先打包自身编译的类文件
    from sourceSets.main.output
    // 再添加依赖,同时排除可能冲突的META-INF签名文件
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }.exclude('META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA')
}

2. 清理Gradle缓存

缓存损坏也可能导致构建出的Jar包异常,执行以下命令清理缓存后重新构建:

./gradlew clean build --no-build-cache

3. 验证主类路径与Jar结构匹配

  • 如果你的Main.java没有包声明,Jar根目录下必须直接存在Main.class;如果移到了包中(比如com.example),Jar内的路径必须是com/example/Main.class,同时清单文件的Main-Class属性要写com.example.Main(注意大小写完全一致)。
  • 可以用jar tf your-jar-file.jar命令列出Jar内的所有文件,确认Main.class的路径和清单配置的主类名完全对应。

4. 启用application插件排查问题

注释掉的application插件可以帮你快速验证主类是否能正常加载,修改配置如下:

plugins {
    id 'java'
    id 'application'
}

mainClassName = 'Main' // 替换为实际全限定类名

repositories {
    mavenCentral()
}

// 保留原有的jar任务或暂时注释,先测试run命令
// jar { ... }

dependencies { ... }

执行./gradlew run,如果能正常运行,说明主类本身没问题,问题出在自定义的Jar打包逻辑上,再针对性调整Jar任务配置。

5. 检查JDK版本一致性

确保构建Jar包使用的JDK版本和运行Jar的JDK版本兼容,避免因字节码版本不兼容导致的类加载异常(虽然这个场景下报错通常不同,但可以排除)。

内容的提问来源于stack exchange,提问作者jarhead

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:32:49