这个问题网上搜索已经有很多回答,基本就是用压缩软件打开jar包,jar包的结构不是如下结构。
我的jar包进来就是BOOT-INF\classes下的内容,而jar包启动是要依靠META-INF\MANIFEST.MF文件,该文件指明了程序的入口以及版本信息等内容。
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: xxxxx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.xxx.xxxApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.6.3
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_212
Main-Class: org.springframework.boot.loader.JarLauncher
###主要条目说明
# Main-Class代表了Spring Boot中启动jar包的程序
# Start-Class属性就代表了Spring Boot程序的入口类,这个类中应该有一个main方法
# Spring-Boot-Classes代表了类的路径,所有编译后的class文件,以及配置文件,都存储在该路径下
# Spring-Boot-Lib表示依赖的jar包存储的位置
解决办法就是maven pom文件中可以配置spring-boot-maven-plugin插件,但是怎么配网上文章都雷同且没有说清楚,一直不生效,最后还是在Spring官网找到解决办法。
参考链接:Spring Boot Maven Plugin Documentation
重要部分翻译如下:
打包可执行程序
该插件(spring-boot-maven-plugin)可以将所有应用依赖的文件打成可执行程序(jar包或war包),并可通过java -jar
运行。
打包可执行文件由 repackage 目标执行,如以下示例所示:
<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>
重点 | If you are using |
意思就是如果你是通过继承spring-boot-starter-parent
来使用Springboot(3.1. Inheriting the Starter Parent POM):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
</parent>
那么repackage这个配置已经预先配置好了,所以不需要再配置,就是网上贴的最多的如下插件配置方式:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
但是我项目使用Springboot的方式是:(3.2. Using Spring Boot without the Parent POM)
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
所以我必须在plugin的配置上加入repackage这个配置才能成功。