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

使用Gradle构建Java应用后运行jar报错:找不到或无法加载主类Main

问题根因

  • 你当前使用Gradle默认jar任务生成的jar包仅包含项目自身编写的类文件,没有把JDA、Jackson等第三方依赖打包进去,运行时依赖缺失导致JVM无法正常加载主类,即便主类路径配置完全正确也会触发该报错。
  • 你当前build.gradle存在结构错误:stage任务定义写在了dependencies代码块内部,不属于正确的配置层级。
  • 额外可排查点:你给出的jar包内类文件显示为Resourses.class,和项目中的Resources.class拼写不一致,可能存在类名拼写错误。

解决步骤

方案1:使用Shadow插件生成可执行Fat Jar(推荐)

该插件会自动把所有依赖合并进最终jar包,同时正确处理依赖冲突和配置合并:

  1. 修改build.gradle配置如下,把stage任务移出dependencies块,添加Shadow插件:
plugins {
    id 'java'
    // Shadow插件版本适配Gradle 6+,如果你使用更低版本Gradle可对应调整插件版本
    id 'com.github.johnrengelman.shadow' version '6.1.0'
}
 
jar {
    manifest {
        attributes(
                'Main-Class': "Main"
        )
    }
}

// 配置shadowJar任务继承jar的manifest配置
shadowJar {
    manifest.inheritFrom project.tasks.jar.manifest
    mergeServiceFiles() // 处理JDA等依赖的服务配置文件合并,避免运行报错
}
 
group 'com.ZoneNewsDiscordBot'
version '1.0-SNAPSHOT'
 
sourceCompatibility = 1.8
 
repositories {
    mavenCentral()
    jcenter()
}
 
dependencies {
    implementation "joda-time:joda-time:2.2"
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    implementation 'net.dv8tion:JDA:4.2.0_214'
 
    // JSON解析依赖
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.3'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.11.3'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.11.3'
 
    // 网页图片上传依赖
    implementation group: 'net.sourceforge.htmlunit', name: 'htmlunit', version: '2.45.0'
 
    // Instagram相关依赖
    implementation group: 'com.restfb', name: 'restfb', version: '3.13.0'
    implementation 'com.github.instagram4j:instagram4j:2.0.3'
    implementation group: 'org.brunocvcunha.instagram4j', name: 'instagram4j', version: '1.14'
}

// 将stage任务移到dependencies代码块外部
task stage(dependsOn: ['shadowJar', 'clean'])
shadowJar.mustRunAfter clean
  1. 执行构建命令:Linux/Mac运行./gradlew shadowJar,Windows运行gradlew.bat shadowJar
  2. 构建完成后到build/libs目录下找到带all后缀的jar包,比如ZoneNewsDiscordBot-1.0-SNAPSHOT-all.jar,直接执行运行命令即可:
java -jar ZoneNewsDiscordBot-1.0-SNAPSHOT-all.jar

方案2:不使用插件,手动配置jar任务打包依赖

如果你不想引入额外插件,可以修改jar任务配置,把所有依赖的类解压后合并进jar:
将原有jar任务配置修改为:

jar {
    manifest {
        attributes(
                'Main-Class': "Main"
        )
    }
    // 把所有运行时依赖的内容合并进jar
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    // 排除重复文件避免打包冲突
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

修改后执行./gradlew jar构建,直接运行生成的原有jar包即可。

额外验证点

如果修改后仍然报错,可以检查:

  • 确认你的Main.java没有声明包名,如果有包名需要在Main-Class属性里写全限定名,比如com.example.Main
  • 确认生成的MANIFEST.MF文件末尾有空行,否则JVM可能无法正确读取配置
  • 确认Resources类的拼写和代码声明一致,避免类加载失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:05