在使用idea快速创建的Spring Boot项目时,使用默认生成的pom.xml里自带的插件进行打包。在使用java -jar运行jar包时会出现 xxxxx-0.0.1-SNAPSHOT.jar中没有主清单属性
默认生成的pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打出的jar包解压后是这个目录
缺少了BOOT-INF这个文件夹及其里面的文件,并且MANIFEST.MF文件内容也不对
错误MANIFEST.MF内容
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Administrator
Created-By: Apache Maven 3.5.3
Build-Jdk: 1.8.0_181
原因是jar包中的META-INF文件夹下的MANIFEST.MF文件缺少配置
而这个MANIFEST.MF就是一个清单文件。
想要打出可以直接部署的jar包需要在pom文件上的maven插件更新为这么一段配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
再打出来的jar包就变成了这样的目录结构
最终生成的MANIFEST.MF
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: Administrator
Start-Class: com.dyh.SpringbootTestApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.2.RELEASE
Created-By: Apache Maven 3.5.3
Build-Jdk: 1.8.0_181
Main-Class: org.springframework.boot.loader.JarLauncher
这样打成的jar包就可以通过java -jar 命令直接运行项目