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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:10:45