使用IntelliJ与Gradle打包Jar时缺失主清单属性的问题排查
构建Gradle单模块Jar时始终提示"no main manifest attribute"的问题
此前已有多人提出类似问题,但我尝试了所有已知解决方案均无效。我正尝试使用IntelliJ与Gradle构建一个简单的单模块Jar程序,以下是我的build.gradle.kts文件:
plugins { id("java") } group = ... version = ... repositories { mavenCentral() } dependencies { implementation("com.itextpdf:itext7-core:7.2.3") implementation("jakarta.mail:jakarta.mail-api:2.1.0") implementation("org.apache.commons:commons-csv:1.9.0") implementation("commons-net:commons-net:3.8.0") implementation("mysql:mysql-connector-java:8.0.30") val slf4jVersion = "2.0.3" implementation("org.slf4j:slf4j-api:$slf4jVersion") implementation("org.slf4j:slf4j-simple:$slf4jVersion") testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1") } tasks.withType<Jar> { manifest { attributes["Main-Class"] = ... attributes["Class-Path"] = configurations.runtimeClasspath.get().asPath } // from(configurations.compileClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) } tasks.getByName<Test>("test") { useJUnitPlatform() }
目前我已注释掉from(configurations...)代码,但无论是否注释该代码,问题都存在。当我构建Jar文件并在终端运行时,始终报错:
no main manifest attribute, in ...jar
我已尝试创建数十种不同的工件,调整META-INF文件夹位置(放置在resources或src/main下),并在项目结构的工件菜单中直接将resources、META-INF及清单文件内容添加至Jar,但均无效果。我已无计可施,请问我哪里操作有误?
问题排查与解决方法
- 务必替换Main-Class的占位符:你在
attributes["Main-Class"] = ...处的省略号必须替换成主类的完整包名+类名,比如com.yourpackage.YourMainClass,留占位符会导致Manifest文件中没有有效的主类配置。 - 放弃IntelliJ工件构建,直接用Gradle任务:IntelliJ的工件配置容易和Gradle的自动配置冲突,直接在终端执行
./gradlew jar(Windows系统用gradlew.bat jar),构建后的Jar文件在build/libs目录下,直接运行这个Jar文件测试。 - 删除手动创建的META-INF文件夹:Gradle会自动在
build目录下生成正确的Manifest文件,手动添加的META-INF会被覆盖或干扰配置,删掉所有手动创建的META-INF相关内容,完全依赖Gradle的配置。 - 推荐使用application插件简化配置:如果需要可执行Jar,使用Gradle的
application插件更稳定,无需手动配置Manifest:
执行plugins { java application } application { mainClass.set("com.yourpackage.YourMainClass") // 替换为你的主类全名 }./gradlew run可以直接运行程序,执行./gradlew installDist会生成包含依赖的可执行脚本;若需要把所有依赖打包进Jar,可添加shadow插件生成fat jar:
执行plugins { id("com.github.johnrengelman.shadow") version "7.1.2" } shadowJar { manifest { attributes["Main-Class"] = "com.yourpackage.YourMainClass" } }./gradlew shadowJar即可得到包含所有依赖的可执行Jar。
内容的提问来源于stack exchange,提问作者nathlrowe
相关产品推荐
相关产品推荐

