java -jar xxx.jar 提示xxx.jar中没有主清单属性报错解决方案

xxx.jar 中没有主清单属性 (no main manifest attribute)解决方案

java -jar xxx.jar 提示xxx.jar中没有主清单属性报错解决方案

这个错通常出现在你用 java -jar xxx.jar 启动,但 JAR 的 META-INF/MANIFEST.MF 里没有 Main-Class 条目(或没按可执行 JAR 的方式打包)。快速检查 + 常见解决方案如下:


用构建工具打出可执行 JAR

如果你用 MavenGradle ,推荐在构建阶段就写好 Main-Class 并(如果需要)生成 fat/uber-jar。

Maven (maven-jar-plugin):

xml 复制代码
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.qwen.QwenChatApplication</mainClass>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

生成包含依赖的可执行 jar 用 maven-shade-pluginspring-boot-maven-plugin(Spring Boot 项目)。

Gradle(普通 jar):

groovy 复制代码
jar {
  manifest {
    attributes 'Main-Class': 'com.example.Main'
  }
}

如果要包含依赖(fat jar),用 shadow 插件或 application 插件的打包方式。


常见坑 & 提示

  • Main-Class 值必须是完全限定类名 (包含包名),且该类要有 public static void main(String[] args)
  • MANIFEST.MF 文件末尾必须以换行结尾,否则属性可能不会生效。
  • 如果这个 jar 只是一个 library(不是可执行),它本来就可能没有 Main-Class,这时应通过 -cp 指定主类或使用项目提供的启动脚本。
  • Spring Boot、jar-with-dependencies、shade 等工具会改变启动方式(Spring Boot 会用自己的启动器),请按对应工具文档打包。

修复完以后,再次运行就可以看到正常的启动信息输出了。