Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误

问题截图如下:

Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误_第1张图片

解决方法:

1.首先在项目的pom.xml引入插件,具体操作是在pom.xml文件中的到之间添加如下代码:

<plugin>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-maven-pluginartifactId>
    <version>2.4.3version>
plugin>

2.加载后可以看到Maven中包含了关于spring-boot-maven-plugin的插件:

Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误_第2张图片

上图中各个插件对应的功能如下:

  • build-info:生成项目的构建信息文件 build-info.properties
  • repackage:这个是默认 goal,在 mvn package 执行之后,这个命令再次打包生成可执行的 jar,同时将 mvn package 生成的 jar 重命名为 *.origin
  • run:这个可以用来运行 Spring Boot 应用
  • start:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
  • stop:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理

3.将项目重新打包

  • **方法一:**通过命令行在对应目录下执行以下指令打包

    mvn clean package

  • **方法二:**直接在IDEA中直接点击clean和package两个选项(比较推荐这个方法,操作起来更加方便)
    Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误_第3张图片
    打包后可以看到target目录下生成的jar包:

​ 在以下的两个jar包中,第一个demo-0.0.1-SNAPSHOT.jar是spring-boot-maven-plugin插件重新打包后生成的可执行jar,可以在cmd中以”java -jar demo-0.0.1-SNAPSHOT.jar“指令执行。

​ demo-0.0.1-SNAPSHOT.jar.original这个则是mvn package打包的原始jar,在spring-boot-maven-plugin插件repackage命令操作时重命名为xxx.original,这个是一个普通的jar,可被引用于其他项目。

Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误_第4张图片

相关知识点:

  • demo-0.0.1-SNAPSHOT.jar中的目录结构

Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误_第5张图片

其中BOOT-INF主要是一些启动信息,包含classes和lib文件,classes文件放的是项目里生成的字节文件class和配置文件,lib文件是项目所需要的jar依赖。

META-INF目录下主要是maven的一些元数据信息,MANIFEST.MF文件内容如下:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: helloworld
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.zhang.demo.HelloworldApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.4.3
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

其中Start-Class是项目的主程序入口,即main方法。Springboot-Boot-Classes和Spring-Boot-Lib指向的是生成的BOOT-INF下的对应位置。

  • demo-0.0.1-SNAPSHOT.jar.original的MANIFEST.MF文件内容如下:

Manifest-Version: 1.0
Implementation-Title: helloworld
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Jar Plugin 3.2.0

其中没有包含Start-Class、Main-Class等信息,这个与可执行jar的该文件存在很多差异,而且目录结构也有很大差异。

一般对使用spring-boot-maven-plugin插件打出的可执行jar不建议作为jar给其他服务引用,因为可能出现访问可执行jar中的一些配置文件找不到的问题。如果想让构建出来的原始jar不被重新打包,可以对spring-boot-maven-plugin插件配置classifier属性,自定义一个可运行jar名称,这样该插件就不会对原始的jar重命名操作了。

<configuration>
    
    <mainClass>com.common.util.CommonUtilsApplicationmainClass>
    
    <classifier>Rosalhclassifier>
configuration>

问题解决后,可成功运行jar包

Spring-boot项目打包成jar包运行时出现“没有主清单属性”错误_第6张图片

你可能感兴趣的:(web,maven,spring,boot,jar)