SpringBoot+Gradle打包可执行Jar报错:no main manifest attribute
解决SpringBoot+Gradle打包Jar提示"no main manifest attribute"问题
核心原因
手动创建的MANIFEST.MF文件几乎不会被Gradle的打包流程正确识别——要么被SpringBoot插件生成的manifest覆盖,要么因为存放位置不符合Gradle规范而被忽略。此外,SpringBoot可执行Jar需要的manifest属性不止Main-Class,还包括Start-Class等,手动配置容易遗漏关键项。
解决方案
1. 使用SpringBoot官方Gradle插件打包(推荐)
这是最可靠的方式,插件会自动生成符合要求的manifest,并将所有依赖打包进可执行Jar:
- 确保你的
build.gradle中引入SpringBoot插件,示例配置:plugins { id 'java' id 'org.springframework.boot' version '3.2.0' // 替换为你的SpringBoot版本 id 'io.spring.dependency-management' version '1.1.4' } group = 'com.sharelink' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' // 替换为你的JDK版本 } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } - 执行打包命令:
- Windows:
gradlew.bat bootJar - Linux/Mac:
./gradlew bootJar
- Windows:
- 打包完成后,可执行Jar会生成在
项目根目录/build/libs/下,直接用java -jar 文件名.jar运行即可。
2. 手动配置Gradle的manifest(不推荐)
如果一定要自定义manifest,需在Gradle的jar任务中配置,而非手动创建文件:
jar { manifest { attributes( 'Manifest-Version': '1.0', 'Main-Class': 'com.sharelink.api.SharelinkApiApplication', 'Start-Class': 'com.sharelink.api.SharelinkApiApplication' // SpringBoot必须的属性 ) } }
⚠️ 注意:这种方式打包的Jar不包含依赖,需要额外处理依赖路径,因此不建议用于SpringBoot项目。
3. 修正IntelliJ的Artifact配置
如果你用IntelliJ手动配置Artifact打包,需确保基于SpringBoot的bootJar任务:
- 打开
File -> Project Structure -> Artifacts - 删除现有的
api_jarartifact - 点击
+→JAR→From modules with dependencies - 选择主类
com.sharelink.api.SharelinkApiApplication,勾选Include in project build - 确认依赖打包方式选择"extract to the target JAR"或正确配置依赖路径
- 重新构建Artifact后运行
4. 验证Jar的manifest内容
可以用命令检查Jar内的manifest是否正确:
- 查看Jar内文件列表:
jar tf api.jar,确认META-INF/MANIFEST.MF存在 - 提取manifest文件:
jar xf api.jar META-INF/MANIFEST.MF,打开文件检查是否包含Main-Class和Start-Class属性
内容的提问来源于stack exchange,提问作者Luc as
相关产品推荐
相关产品推荐

