Maven指令打包SpringBoot项目提示没有主清单文件问题
作者:一颗贪婪的星
在Java开发中,打包Jar时常会遇到“没有主清单属性”的错误,这通常是因为在pom.xml文件中没有正确配置maven插件导致的,特别是在使用自定义的<parent/>节点而非spring-boot-starter-parent时
Maven指令打包SpringBoot项目提示没有主清单文件
项目打包为Jar后
通过java -jar xxxxx.jar运行时提示xxxxx.jar中没有主清单属性,如下:
打开jar包
META-INF目录下的MANIFEST.MF,内容如下:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: greedystar Created-By: Apache Maven 3.2.5 Build-Jdk: 1.8.0_181
我们发现这里没有主类等信息,是什么原因导致的呢?
网上大多数资料指出需要在pom.xml中配置maven插件,如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
这种解决方案通常可以解决大部分问题,但这种方案只在使用 spring-boot-starter-parent 为 <parent/> 标签内容时才有效,当我们使用自定义的<parent/>节点时按如上所述的方式配置maven插件则是无效的,这是为什么呢?让我们一起看一看 spring-boot-starter-parent 中的配置。
spring-boot-starter-parent 中maven插件的配置如下:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>${start-class}</mainClass> </configuration> </plugin>
我们可以看到这里配置了主类信息以及一个重要的标签<goal>,对repackage的描述如下:
Repackages existing JAR and WAR archives so that they can be executed from the command line using java -jar.
看到这里我们就清楚了,当使用自定义的 parent 时,我们需要自行配置maven插件的<goal>属性,如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
指定mvn clean package指令打包jar包后看一下清单文件
内容如下:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: greedystar Start-Class: cn.bimart.scf.bc.tx.server.TxServerApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Version: 2.1.1.RELEASE Created-By: Apache Maven 3.2.5 Build-Jdk: 1.8.0_181 Main-Class: org.springframework.boot.loader.JarLauncher
这样项目就打包成功了,通过java -jar也可以正确运行了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。