spring-boot-maven-plugin插件_客 人的博客-程序员资料

技术标签: springboot  

<build>
   <plugins>
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
   </plugins>
</build>
spring boot加上这个插件,才可以使用Java -jar命令来启动jar包,并且有了这个插件,
打的包里面才会有maven依赖的jar包和spring boot的启动类,所以打的jar包也就比较大,
而且MANIFEST.MF文件里面也会有启动类的信息。但是如果不加这个插件,则打的包里面就只有class文件,
没有依赖的Jar包,MANIFEST.MF文件里面也没有启动类的信息,所以如果不加这个插件就不能独立启动。
注意:在用idea调试的时候加不加插件都可以启动,看不出来不同,所以必须要独立启动jar包才可以看出来。
而且如果用了spring boot但是不需要独立启动,就不要加这个插件,否则spring boot会因为找不到启动类而导致报错

Spring Boot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供Spring Boot的支持,即为Spring Boot应用提供了执行Maven操作的可能。
Spring Boot Maven plugin能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。
Spring Boot Maven plugin的最新版本为2017.6.8发布的1.5.4.RELEASE,要求Java 8, Maven 3.2及以后。

1. Spring Boot Maven plugin的5个Goals

  • spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin
  • spring-boot:run,运行Spring Boot应用
  • spring-boot:start,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • spring-boot:stop,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • spring-boot:build-info,生成Actuator使用的构建信息文件build-info.properties

2. 配置pom.xml文件

[html]  view plain  copy
  1. <build>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <groupId>org.springframework.boot</groupId>  
  5.             <artifactId>spring-boot-maven-plugin</artifactId>  
  6.                         <version>1.5.4.RELEASE</version>  
  7.         </plugin>  
  8.     </plugins>  
  9. </build>  


3.mvn package spring-boot:repackage说明

Spring Boot Maven plugin的最主要goal就是repackage,其在Maven的package生命周期阶段,能够将mvn package生成的软件包,再次打包为可执行的软件包,并将mvn package生成的软件包重命名为*.original。

基于上述配置,对一个生成Jar软件包的项目执行如下命令。

[html]  view plain  copy
  1. mvn package spring-boot:repackage  

可以看到生成的两个jar文件,一个是*.jar,另一个是*.jar.original。

在执行上述命令的过程中,Maven首先在package阶段打包生成*.jar文件;然后执行spring-boot:repackage重新打包,查找Manifest文件中配置的Main-Class属性,如下所示:

[html]  view plain  copy
  1. Manifest-Version: 1.0  
  2. Implementation-Title: gs-consuming-rest  
  3. Implementation-Version: 0.1.0  
  4. Archiver-Version: Plexus Archiver  
  5. Built-By: exihaxi  
  6. Implementation-Vendor-Id: org.springframework  
  7. Spring-Boot-Version: 1.5.3.RELEASE  
  8. Implementation-Vendor: Pivotal Software, Inc.  
  9. Main-Class: org.springframework.boot.loader.JarLauncher  
  10. Start-Class: com.ericsson.ramltest.MyApplication  
  11. Spring-Boot-Classes: BOOT-INF/classes/  
  12. Spring-Boot-Lib: BOOT-INF/lib/  
  13. Created-By: Apache Maven 3.5.0  
  14. Build-Jdk: 1.8.0_131  

注意,其中的Main-Class属性值为org.springframework.boot.loader.JarLauncher;

Start-Class属性值为com.ericsson.ramltest.MyApplication。


其中com.ericsson.ramltest.MyApplication类中定义了main()方法,是程序的入口。

通常,Spring Boot Maven plugin会在打包过程中自动为Manifest文件设置Main-Class属性,事实上该属性究竟作用几何,还可以受Spring Boot Maven plugin的配置属性layout控制的,示例如下。

[html]  view plain  copy
  1. <plugin>  
  2.   <groupId>org.springframework.boot</groupId>  
  3.   <artifactId>spring-boot-maven-plugin</artifactId>  
  4.   <version>1.5.4.RELEASE</version>  
  5.   <configuration>  
  6.     <mainClass>${start-class}</mainClass>  
  7.     <layout>ZIP</layout>  
  8.   </configuration>  
  9.   <executions>  
  10.     <execution>  
  11.       <goals>  
  12.         <goal>repackage</goal>  
  13.       </goals>  
  14.     </execution>  
  15.   </executions>  
  16. </plugin>  
注意,这里的layout属性值为ZIP。

layout属性的值可以如下:

  • JAR,即通常的可执行jar
Main-Class : org.springframework.boot.loader.JarLauncher
  • WAR,即通常的可执行war,需要的servlet容器依赖位于WEB-INF/lib-provided
Main-Class : org.springframework.boot.loader.warLauncher
  • ZIP,即DIR,类似于JAR
Main-Class : org.springframework.boot.loader.PropertiesLauncher
  • MODULE,将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何Launcher。
  • NONE,将所有的依赖库打包,但是不打包Spring Boot的任何Launcher。

4.integration-test阶段中的Spring Boot Maven plugin的start/stop

[html]  view plain  copy
  1. <properties>  
  2.   <it.skip>false</it.skip>  
  3. </properties>  
  4. <build>  
  5.   <plugins>  
  6.     <plugin>  
  7.       <groupId>org.apache.maven.plugins</groupId>  
  8.       <artifactId>maven-failsafe-plugin</artifactId>  
  9.       <configuration>  
  10.         <skip>${it.skip}</skip>  
  11.       </configuration>  
  12.     </plugin>  
  13.     <plugin>  
  14.       <groupId>org.springframework.boot</groupId>  
  15.       <artifactId>spring-boot-maven-plugin</artifactId>  
  16.       <version>1.5.4.RELEASE</version>  
  17.       <executions>  
  18.         <execution>  
  19.           <id>pre-integration-test</id>  
  20.           <goals>  
  21.             <goal>start</goal>  
  22.           </goals>  
  23.           <configuration>  
  24.             <skip>${it.skip}</skip>  
  25.           </configuration>  
  26.         </execution>  
  27.         <execution>  
  28.           <id>post-integration-test</id>  
  29.           <goals>  
  30.             <goal>stop</goal>  
  31.           </goals>  
  32.           <configuration>  
  33.             <skip>${it.skip}</skip>  
  34.           </configuration>  
  35.         </execution>  
  36.       </executions>  
  37.     </plugin>  
  38.   </plugins>  
  39. </build>  
注意,it.skip变量用作是否跳过integration-test的标志位。

maven-failsafe-plugin用作integration-test的主要执行目标。

spring-boot-maven-plugin用以为integration-test提供支持。


执行integration-test的Maven命令如下:

mvn verify

或者

mvn verify -Dit.skip=false



参考链接:

http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/maven-plugin/
https://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33314107/article/details/79731899

智能推荐

JAVA-eclipse检测题:给出一个分数,按不同的分数段将其评定为A、B、C、D和E五个档次之一,使用 switch语句进行编写(大于等于90,输出语句为:您的成绩为:A,大于等于80,输出语句为_你好,我是薛同学!的博客-程序员资料

package my;import java.util.Scanner;public class hello { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); System.out.println("请输入您的成绩:"); int score = s...

CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: Internal CMake error, TryCo_哪有天生的学霸,一切都是厚积薄发的博客-程序员资料

CMake Error: CMAKE_C_COMPILER not set, after EnableLanguageCMake Error: Internal CMake error, TryCompile configure of cmake failed-- Check size of unsigned int - failed-- Check size of unsigned longCMake Error at /usr/share/cmake/Modules/CMakeCInformat

关键路径详解_自由の翼Az的博客-程序员资料_关键路径

AOV网:顶点活动(Activity On Vertex,AOV)网是指用顶点表示活动,而用边集表示活动间优先关系的有向图。例如图10-57的先导课程示意图就是AOV网,其中图的顶点表示各项课程,也就是“活动”;有向边表示课程的先导关系,也就是“活动间的优先关系”。显然,图中不应当存在有向环,否则会让优先关系出现逻辑错误。AOE网:边活动(Activity On Edge,A...

点亮LED灯实验、系统时钟设置、LED灯闪烁实验、 位带操作_希望之下的博客-程序员资料_修改了led驱动的时钟源频率,从256khz修改到131khz。

点亮LED灯实验原理由LED电路图,PCX端口输入低电平,则灯亮;输入高电平,则灯灭。准备APP文件:外设(如LED)驱动文件夹。这里是LED的驱动程序(led.c)和头文件(led.h)。添加led文件路径。需对GPIO外设操作,需要添加驱动程序(stm32f103zet6_gpio.c)和头文件(stm32f103zet6_gpio.h)添加系统是时钟驱动程序(stm32f103...

ICV:预计到2026年,全球mmRadar市场安装量达3.9亿颗_AI_Pro的博客-程序员资料

车载mmRadar技术发展非常成熟,产业竞争格局比较稳定,潜在进入者壁垒较高,特别是专利技术壁垒。在应用方面,24GHz和77GHz依据各自性能特点,较为固定的在角雷达、侧面雷达和长距雷达上进行安装使用。市场未来的主要变化,来自于三方面:1、整个智能驾驶等级提升及汽车数量的增长带动的mmRadar使用量的增长;2、异构传感器融合方案的不确定;3、中国供应商是否能异军突起?日前,全球知名前沿科技咨询机构ICV发布的题为《Global automotive mmRadar market forecast

ASP.NET Web API与Owin OAuth:使用Access Toke调用受保护的API_weixin_33734785的博客-程序员资料

在前一篇博文中,我们使用OAuth的Client Credential Grant授权方式,在服务端通过CNBlogsAuthorizationServerProvider(Authorization Server的一个实现)成功发放了Access Token,并在客户端成功拿到了Access Token。那Access Token有什么用呢?在OAuth中对Resource Server(比...

随便推点

磁盘被写保护无法使用怎么办?_wsmzyzdw的博客-程序员资料_因磁盘有写保护而无法写入磁盘

为了防止磁盘上的东西被误删或者被随意改写,磁盘上往往设有写保护功能,打开写保护后就无法往磁盘上写任何数据,同样也无法删除数据。这种情况往往发生在U盘和移动硬盘等设备上。 U盘被写保护 先看下U盘是否有保护开关,如果有,那你就只需要拨动开关。如果没有,那你就得准备点家伙了:把你的U盘拆开,找到铜片,其中应该有个铜片是陷下去的,只要将它拨起来,和上面的铜片全部接触就行了。如果不是...

C++字符串完全指引之二 —— 字符串封装类_iteye_7408的博客-程序员资料

C++字符串完全指引之二——字符串封装类原著:MichaelDunn作者:ChengjieSun原文出处:CodeProject:TheCompleteGuidetoC++Strings,PartII引言  因为C语言风格的字符串容易出错且不易管理,黑客们甚至利用可能存在的缓冲区溢出bug把C语言风格的字符串作为攻击目标,所以出现了很多字符串封装类。不幸的是,在某...

java中事务的传播属性和隔离级别_忘不掉就记着吧的博客-程序员资料_java事务默认隔离级别

七个事务传播属性1. Propagation.REQUIRED:支持当前事务,如果当前没有事务,则新建一个事务,默认使用这种,也是最常见的.2. Propagation.SUPPORTS:支持当前事务,如果没有事务,就以非事务的方式执行.3. Propagation.MANDATORY:支持当前事务,如果没有事务,就抛出异常.4. Propagation.REQUIRES_NEW:新建事务...

python虚拟环境的目录是啥_Python 虚拟环境_weixin_39935777的博客-程序员资料

前言有的时候因为各种原因,在操作系统下,我们会安装很多版本的Python解释器。同样,我们也有可能因为各种原因,需要不同版本的模块,比如Django1.8,Django1.11。再加上pip工具管理器的版本混乱问题。这就使得很多人在Python的环境管理上产生极大的混乱。通常每个项目,甚至项目不同阶段的版本,需要不同的Python解释器和依赖库。为了清晰明了,安全可靠的管理这些环境,需要为每个项目...

vue 2.6 插槽更新 v-slot 用法总结_LLLLLLLLLLLLL刘的博客-程序员资料

插槽我的理解就是父页面在组件标签内插入任意内容,子组件内插糟slot控制摆放位置(匿名插槽,具名插槽)插槽分类插槽一共就三大类1.匿名插槽(也叫默认插槽): 没有命名,有且只有一个2.具名插槽: 相对匿名插槽组件slot标签带name命名的3.作用域插槽: 子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)匿名插槽(也叫默认插槽default)用法:我的理解,匿...

python:未找到命令_无色云的博客-程序员资料

今天在虚拟机(centos8)编译CRIU时遇到此问题。出现这个问题基本上由于python安装了过多的版本,导致链接失效首先可以使用下面命令查看相关的python的具体位置$ which python/usr/bin/which : no python in (/usr/lib64/bin:/usr/lib64/sbin:/usr/lib/bin)说明确实没有python,然后可以按具...

推荐文章

热门文章

相关标签