springboot打包jar中没有主清单属性问题
作者:橙巴布
这篇文章主要介绍了springboot打包jar中没有主清单属性问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
开场废话
不看过程的可以直接看原因和解决方案
现在大多都是springboot项目了,甚至大多公司使用了多模块用于dubbo和cloud。这里主要简单讲一下新手建项目,可以运行,但是打包没有主清单属性的问题。
出现这种问题的情况肯定不止以下的情况,
以下两种依赖情况:
- a.使用了spring-boot-starter-parent + 插件=打包成功
- b.没有使用spring-boot-starter-parent,用插件+排除=打包成功
项目结构
依赖1-能运行,打包没有清单
主pom: spring-boot-starter-parent 子pom: spring-boot-starter spring-boot-starter-web
主pom文件内容
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>diy</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <modules> <module>diy-common</module> <module>diy-api</module> <module>diy-service</module> </modules> </project>
service pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>diy</artifactId> <groupId>com.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>diy-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
依赖1-改-能运行,打包正常
增加打包插件
主pom: spring-boot-starter-parent 子pom: spring-boot-starter spring-boot-starter-web spring-boot-maven-plugin
server pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>diy</artifactId> <groupId>com.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>diy-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
依赖2-能运行,打包没有清单
主pom中不加parent依赖,在子版本中指定springboot版本
主pom: 子pom: spring-boot-starter spring-boot-starter-web spring-boot-maven-plugin
主 pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>diy</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>diy-common</module> <module>diy-api</module> <module>diy-service</module> </modules> </project>
service pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>diy</artifactId> <groupId>com.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>diy-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.3</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.5.3</version> </plugin> </plugins> </build> </project>
依赖2改-能运行,打包正常
在spring-boot-maven-plugin插件中增加executions
主pom: 子pom: spring-boot-starter spring-boot-starter-web spring-boot-maven-plugin <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>diy</artifactId> <groupId>com.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>diy-service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.3</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.5.3</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
原因分析
使用springboot时需要使用打包插件,插件有很多,这里使用spring-boot-maven-plugin
当我们为了做微服务时,在主pom中不增加多余的依赖时,子中只能设置一个parent,就是主pom,这时spring-boot-starter-parent没有依赖,打包就会没有清单,但是我们是添加了插件的,所以原因可能出在spring-boot-start-parent包中。
查看spring-boot-start-parent内容
这个pom里面添加了一个打包排除
解决方案
使用了 spring-boot-starter-parent依赖的直接加入插件就行
没有使用spring-boot-starter-parent依赖的,除了加插件,在插件中加个排除
<!--这里是有spring-boot-starter-parent依赖的处理--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
<!--这里是没有spring-boot-starter-parent依赖的处理--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--因为没有依赖parent,所以这里版本不能少,一般情况下和上面的starter版本一样,或者可以低那么几个小版本--> <version>2.5.3</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。