一、原因
打包的方式不对,打包的时候少了文件**
二、解决办法
在pom.xml中添加/修改maven打包依赖:
<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>
三、错误实例
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></dependency></dependencies>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
四、原因分析
1.出错现象
2.主清单属性
主清单属性是jar包中MANIFEST.MF文件中的属性,这里主要造成问题的属性是Main-Class: com.tl.SecurityAPP文件位置在我们我打的jar包下META-INF文件夹下
3.描述
当我们将打包插件依赖删除后会发现项目照样可以打包,由此可见我们出错是因为使用了原始maven打包,并没有使用我们添加的打包插件打包。
没有使用打包插件时在项目中打开MANIFEST.MF文件会发现有Main-Class属性,当打开jar包会发现里面的MANIFEST.MF并没有此属性。
使用打包插件后发现MANIFEST.MF有此属性,且多了xxx.jar.original的文件而且jar包结构也不一样。
四、打包依赖分析
<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>
1. 说明
<extensions/> <executions><execution> <id/> <phase/> <goals/> <inherited/> <configuration/></execution></executions>
2.对比出错依赖配置我们会发现多了点:
<executions><execution><goals><goal>repackage</goal></goals></execution> </executions>
repackage有啥用呢?
1.将原始Maven打包形成的jar包进行重新打包,包含应用类文件、配置文件、应用所依赖的jar包、Springboot启动相关类(loader等)。
2.将原始Maven打包形成的jar包备份,并重命名为xxxxxx.jar.original,所以我们发现使用打包插件比原始打包方式多了此文件。
3.使用打包插件打包后我们会发现jar包可以启动了