运行 jar 出现"中没有主清单属性"

2022-05-05 14:50:49 浏览数 (1)

运行 jar 出现"中没有主清单属性"

文章目录

  • 现象
  • 分析原因

现象

在运行通过 “java -jar xxx.jar” 的时候, 报 “中没有主清单属性” 错误.

代码语言:javascript复制
PS D:UsersGatoideazhiqujoke-msjoke-servertarget> java -jar .joke-server-1.0.0-SNAPSHOT.jar
.joke-server-1.0.0-SNAPSHOT.jar中没有主清单属性

分析原因

看报错像是 jar 包中缺少了属性配置. 解压 jar 包后(Spring Boot 项目), 可以看到三个文件夹: BOOT-INF, META-INF, org. META-INF, 元数据信息, 打开后里面有一个 MANIFEST.MF 文件, 该文件指明了程序的入口以及版本信息等内容:

代码语言:javascript复制
Manifest-Version: 1.0
Implementation-Title: joke-server
Implementation-Version: 1.0.0-SNAPSHOT
Built-By: Alan
Implementation-Vendor-Id: com.deepflow
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_181
Implementation-URL: http://localhost/joke-ms/joke-server

下面是正常的版本:

代码语言:javascript复制
Manifest-Version: 1.0
Implementation-Title: joke-server
Implementation-Version: 1.0.0-SNAPSHOT
Built-By: Alan
Implementation-Vendor-Id: com.deepflow
Spring-Boot-Version: 2.0.9.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.deepflow.JokeServerApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_181
Implementation-URL: http://localhost/joke-ms/joke-server

可以看出上面版本比下面版本少了: Main-Class 和 Start-Class 等关键信息.

Main-Class 代表了 Spring Boot 中启动 jar 包的程序 Start-Class 属性就代表了 Spring Boot 程序的入口类,这个类中应该有一个main方法 Spring-Boot-Classes 代表了类的路径, 所有编译后的 class 文件, 以及配置文件, 都存储在该路径下 Spring-Boot-Lib 表示依赖的jar包存储的位置

怎么解决这些问题呢? 当然不是自己手动添加这些信息, 应该是打包的时候除了问题, 到项目 pom 文件里面确认一下有无 maven 构建的插件, 没有的话添加上去再重新打包一下, 然后 maven 插件会自动生成注清单属性. 运行 java -jar xxx.jar 时会根据主清单属性找到启动类, 从而启动程序

代码语言:javascript复制
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

0 人点赞