在不使用spring-boot-maven-plugin插件打包springboot的web项目生成的jar包是无法直接运行的。因为直接打包的jar包仅仅是一个普通的jar包,没有打包依赖也没有指定main-class,所以无法直接运行。
所以需要在pom中引入spring-boot-maven-plugin插件。该插件的作用是对普通的jar包做repackage,从而生成一个可执行的jar文件。
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
这里首先使用了finalName标签配置了生成的jar文件的名称,这样做可以覆盖默认的jar文件,去掉版本号信息。然后在plugins标签下配置了spring-boot-maven-plugin插件。
在如上配置,使用mvn构建可执行jar时,需要显示指定运行插件的goal,比如repackage目标:
mvn clean package spring-boot:repackage
这里先执行了clean生命周期,再执行default生命周期的package阶段,最后是spring-boot插件的repackage目标。
需要注意的是,在执行repackage目标时,必须先执行default生命周期的至少是package的阶段,生成一个默认的jar文件,然后spring-boot插件的repackage目标才能执行成功,如果直接执行repackage,会报错。
当然,每一次手动执行repackage目标比较麻烦,可以在execution标签内指定默认执行的goal:
<build>
<finalName>${project.artifactId}</finalName>
<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的package阶段即可,会按照如上配置执行repackage目标:
mvn clean package
实际使用时,也推荐配置execution标签。
<goal>标签
,有五个可选的值
<!-- 这个是默认值,会再一次打包 -->
<goal>repackage</goal>
<!-- 用于运行Spring Boot应用 -->
<goal>run</goal>
<!-- 用于mvn integration-test阶段,对Spring Boot应用生命周期进行管理 -->
<goal>start</goal>
<!-- 用于mvn integration-test阶段,对Spring Boot应用生命周期进行管理 -->
<goal>stop</goal>
<!-- 用于生成构建信息文件build-info.properties -->
<goal>build-info</goal>
repackage(goal)有如下两个作用:
1、在原始Maven打包形成的jar包基础上,进行重新打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),以此来满足Springboot独立应用的特性;
2、将原始Maven打包的jar重命名为XXX.jar.original作为原始文件;
注意:
1:pom中加入repackage打的是可执行的包,MANIFEST.MF有启动类,但是可执行的包不能作为依赖引入,引入这样的jar会报错找不到类。
2:pom中不加repackage打的是依赖包,不可执行,MANIFEST.MF中没有启动类,但是可以当作依赖jar包引入其他项目中。
参考:
【maven】spring-boot-maven-plugin 使用_spring-boot-maven-plugin作用_绝世好阿狸的博客-CSDN博客