使用Gradle构建Java应用后运行jar报错:找不到或无法加载主类Main
问题根因
- 你当前使用Gradle默认
jar任务生成的jar包仅包含项目自身编写的类文件,没有把JDA、Jackson等第三方依赖打包进去,运行时依赖缺失导致JVM无法正常加载主类,即便主类路径配置完全正确也会触发该报错。 - 你当前
build.gradle存在结构错误:stage任务定义写在了dependencies代码块内部,不属于正确的配置层级。 - 额外可排查点:你给出的jar包内类文件显示为
Resourses.class,和项目中的Resources.class拼写不一致,可能存在类名拼写错误。
解决步骤
方案1:使用Shadow插件生成可执行Fat Jar(推荐)
该插件会自动把所有依赖合并进最终jar包,同时正确处理依赖冲突和配置合并:
- 修改
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
- 执行构建命令:Linux/Mac运行
./gradlew shadowJar,Windows运行gradlew.bat shadowJar - 构建完成后到
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
相关产品推荐
相关产品推荐

