使用 java -jar xxxx.jar 运行 jar 包报错: no main manifest attribute

1、问题描述

Linux服务器上本想运行一下自己写的一个JAR,但是报错了!
no main manifest attribute, in first-real-server-1.0-SNAPSHOT.jar

2、解决办法

在自己的Spring项目的启动类(xxx.xxx.xxx.XXXXApplication)所在的Module中的pom.xml中加上:

powershell 复制代码
 <build>
        <!--最终生成可执行jar的名称-->
        <finalName>first-real-server</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.4.5.RELEASE</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

然后再通过Maven重新构建可执行的 jar , 即可解决问题!

3、浅浅解释下为什么

简单翻译下错误信息:缺少主类


直接原因: MANIFEST.MF 中没有 Main-Class 属性


MANIFEST.MF 是什么:Spring Boot 可执行 JAR 包的核心配置文件


一、先看下报错的 jar

首先解压下这个jar

xml 复制代码
jar xvf first-real-server-1.0-SNAPSHOT. jar

解压后


cat MANIFEST.MF 看到只有三行,并没有 Main-Class 属性


二、再看下重新打包后的jar

xml 复制代码
xxxxxxx@LDMacBook-Pro META-INF % cat MANIFEST.MF 
Manifest-Version: 1.0
Start-Class: org.jing.dong.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 1.4.5.RELEASE
Created-By: Maven JAR Plugin 3.3.0
Main-Class: org.springframework.boot.loader.JarLauncher

解释下各个属性的含义: