Spring Boot spring-boot-maven-plugin 参数配置详解
一 spring-boot-maven-plugin 插件的5个Goals
spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin;重新打包存在的jar或者war包从而使他们可以在命令行使用jar -jar来执行,使用layout=NONE也可以简单的打包有嵌套依赖的jar(没有主类,所以无法执行);它可以替代常规的构件或者连接到构建生命周期并有独立的分级。
spring-boot:run,运行Spring Boot应用
spring-boot:start,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理;启动Spring应用程序。和run目标不同,该目标不会阻塞,并且允许其他目标来操作应用程序。这个目标通常是在应用程序集成测试套件开始之前和停止之后的继承测试脚本中使用;集成spring boot应用程序到集成测试阶段,从而使应用程序在集成测试程序之前启动
spring-boot:stop,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理;停止使用start目标启动的spring应用程序,通常在测试套件完成后被调用。;集成spring boot应用程序到集成测试阶段,从而使应用程序在集成测试程序之前启动
spring-boot:build-info,生成Actuator使用的构建信息文件build-info.properties
2. 配置pom.xml文件
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.5.4.RELEASE</version></plugin></plugins>
</build>
二 应用场景
1 重新打包应用
为了重新打包应用,只需要在pom文件中的plugin配置中如下:
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions>
</plugin>
2 运行应用程序
插件包含了一个run目标,该目标能够从命令行执行应用程序: mvn spring-boot:run
默认情况下,应用从Maven的JVM运行。如果需要在分支中运行,则指定fork选项。如果指定了jvmArguments或者agent参数,分支进程也会执行。
如果需要制定某些JVM参数(如为了debug),可以使用jvmArguments参数,更多细节参考 调试应用 一章。方便起见,为了启用总则(profiles),可以使用特定(profiles)属性来处理,参考 指定使用的配置文件 一章。
Spring Boot 1.3已经推出了devtools,它是提升使用Spring Boot应用开发时经验的一个模块。启用该模块,仅仅在项目中添加如下配置即可:
org.springframework.boot spring-boot-devtools 1.3.0.BUILD-SNAPSHOT true
目前最新是2.0.0.BUILD-SNAPSHOT了。
当devtools运行时,会在重新编译应用时进行检测变化并且自动刷新。这不仅包括资源文件,也包括代码。它也提供了一个激活的可以重加在的服务器,所以不管任何改变都会自动出发浏览器刷新。
devtools也可配置成仅仅静态资源改变时刷新浏览器(也就是忽略代码的改变),仅仅增加如下配置:
spring.devtools.remote.restart.enabled=false
在devtools之前,该插件已经默认支持资源的及时刷新(hot refreshing),为了支持devtools功能,该插件功能已经被禁用。但是可以随时恢复该功能,恢复功能配置如下;
<build>
……<plugins>……<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><configuration><addResources>true</addResources></configuration></plugin>……</plugins>……
</build>
当启用addResources配置时,任意src/main/resources文件夹在应用运行时将被添加到应用的类路径,同时任意target/class中发现重复的资源将被移除。这将在发布web应用时使资源及时刷新非常有用。例如,当使用HTML,CSS和JavaScript文件时,不用重新编译应用就可以立马看到变化。这对前端开发人员不用下载安装Java IDE就可以工作也是一种非常有用的方式。
需要注意的是,该特性的副作用是在构建时资源过滤不起作用
为了与repackage目标保持一致,run目标在构件类路径下文件时将排除在配置依赖时排除的依赖配置。更详细的的请参考 排除一个依赖 章节。
有时候在运行应用时包含测试依赖也是非常有用的。例如,在测试模式下使用根目录类运行应用。如果希望这样做,可以设置useTestClasspath参数的值为true。注意:尽在运行应用时生效:重新打包目标将不会增加测试依赖到结果jar和war包中。
3 使用集成测试
虽然可以很容易从测试(测试套件)本身启动Spring Boot程序,但可能需要在构建自身来处理。为了确信围绕集成测试的Spring Boot应用的生命周期被合适的管理,可以使用start和stop目标。如下配置:
<build>
……<plugins>……<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><executions><execution><id>pre-integration-test</id><goals><goal>start</goal></goals></execution><execution><id>post-integration-test</id><goals><goal>stop</goal></goals></execution></executions></plugin>……</plugins>……
</build>
这样的设置现在可以使用failsafe-plugin来运行你的集成测试,正如你所期待的哪样。
更多详细细节,参 考随机端口的集成测试的。
4 自定义分类重打包
默认情况下,repackage目标将使用可执行的构件来替代原始的构件。如果希望保留原是构件,并且也使用不同的分类来附属保留可执行的构件,可以配置如下:
说明:如果不适用repackage目标,那么maven执行package命令生成的jar包只有一个,名称为pom.xml里面配置的name(artifactId)-version.jar
如果加入了repackage配置,则maven打包生成的jar包会被重命名为name-version.jar.original,使用repackage重新打包生成的jar包名称为name-version.jar,
下面的配置就是如果希望保留原始构件生成的jar包名称不变,同时也想保留repackage打包生成的jar包,可以自定义命名。
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>exec</classifier></configuration></execution></executions></plugin></plugins></build>
</project>
如上配置,那么使用repackage重新生成的包的名称就是name-version-exec.jar,就是在version后面追加了configuration节点中的classifier节点中的值,该值是自定义的。但是如果classifier节点中什么值都不写,那么就和默认的repackage配置一样,即原始的构件为name-version.jar.original,repackage打包的jar为name-version.jar
5 排除依赖
默认情况下,repackage和run目标都会包含所有provided scope的依赖。基于boot的项目应该考虑provided scope的依赖就像容器所需要的依赖包来使应用可以运行。
**有三种方式可以排除运行时被打包使用的依赖
1、通过指定groupId和artifactId来排除依赖(如果需要可以指定classifier,这是可选的)
2、通过指定artifactId,来排除所有匹配的依赖
3、通过指定groupId,来排除所有属于该group的依赖
如下通过指定groupId和artifactId排除依赖 **
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><configuration><excludes><exclude><groupId>com.foo</groupId><artifactId>bar</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
如上配置就会排除对com.foo:bar的jar包
如下通过指定artifactId,来排除artifactId与此匹配的所有依赖
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><configuration><excludeArtifactIds>my-lib,another-lib</excludeArtifactIds></configuration></plugin></plugins></build>
</project>
如上配置就会排除所有artifactId为my-lib和another-lib的jar包
如下通过指定groupId,来排除groupId与此匹配的所有依赖
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><configuration><excludeGroupIds>com.foo</excludeGroupIds></configuration></plugin></plugins></build>
</project>
如上配置则排除掉所有groupId为com.foo的jar包
###6 调试应用
默认情况下,run目标和mvn命令是在同一个进程中执行的,除非jvm参数或者客户端明确指定。可以通过使用fork属性明确的开启或者关闭是否在同一进程中执行。
如果需要fork这个进程并且进行调试,可以添加需要的JVM参数来开启远程调试。如下配置为挂起进程,直到有调试请求从5005端口进入。
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><configuration><jvmArguments>-Xdebug -Xrunjdwp:transport=dt_sorket,server=y,suspend=y,address=5005
</jvmArguments></configuration></plugin></plugins></build>
</project>
需要注意的是,只要你指定了这些JVM参数,这个进程就会自动被fork。这些jvm擦书也可以在命令行中指定,确认书写正确:
mvn spring-boot:run -Drun.jvmArguments=“-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005”
7 集成测试的随机端口
Spring Boot集成测试的一个好特性是它能够为Web应用分配一个空闲端口。当start目标插件使用时,Spring Boot应用是被分离执行的,这让传递给集成测试程序本身实际的端口变得非常困难。
如下的配置展示如何使用build-help-plugin插件达到相同的特性。
<project><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>build-helper-maven-plugin</artifactId><executions><execution><id>reserve-tomcat-port</id><goals><goal>reserve-network-port</goal></goals><phase>process-resources</phase><configuration><portNames><portName>tomcat.http.port</portName></portNames></configuration></execution></executions></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><executions><execution><id>pre-integration-test</id><goals><goal>start</goal></goals><configuration><arguments><argument>--server.port={tomcat.http.port}</test.server.port></systemPropertyVariables></configuration></plugin></plugins></build>
现在可以在任意的集成测试中查询test.server.port系统属性来给server创建一个合适的url。
8 指定使用的配置文件
一个特定应用使用的配置文件可以通过profiles参数指定。如下配置启动了foo和bar两个配置文件:
<project><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.3.0.BUILD-SNAPSHOT</version><configuration><profiles><profile>foo</profile><profile>bar</profile></profiles></configuration></plugin></plugins></build>
</project>
使用哪个配置文件也可以通过命令行参数配置,如果有多个,需要使用都好将他们隔开:
mvn spring-boot:run -Drun.profiles=bar,foo
相关文章:
Spring Boot spring-boot-maven-plugin 参数配置详解
一 spring-boot-maven-plugin 插件的5个Goals spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin;重新打包存在的jar或者war包从而使他们可以在命令行使用…...
linux中断调用流程(arm)
文章目录 ARM架构下Linux中断处理全流程解析:从硬件触发到驱动调用 ⚡**一、中断触发与硬件层响应** 🔌**1. 设备触发中断** 📡 **二、CPU阶段:异常入口与上下文处理** 🖥️**1. 异常模式切换** 🔄**2. 跳转…...
考研复试问题总结-数据结构(1)
1. 说一下你对数据结构的理解 我觉得数据结构不仅仅是存数据的“容器”,更是一种思维方式。其实,在我们写程序时,经常会遇到各种各样的数据操作需求,而不同的数据结构能解决问题的效率和方式都不一样,所以选择合适的数…...
250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示
A. 最终效果 B. 火山方舟配置(一定要点击添加) C. 硅基流动配置(最好要点击添加,否则会自动弹出所有模型) D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤: 在Functions函…...
RuoYi框架介绍,以及如何基于Python使用RuoYi框架
若依框架(RuoYi)是一款基于Spring Boot和Vue.js的开源快速开发平台,广泛应用于企业级应用开发。它提供了丰富的功能模块和代码生成工具,帮助开发者快速搭建后台管理系统。 主要特点 前后端分离:前端采用Vue.js&#x…...
【算法】图论 —— Floyd算法 python
洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m,分别代表点的个数和边的条数。 接下来 m m m 行,每行三…...
2.数据结构:2.最大异或对
数据结构 2.数据结构:1.Tire 字符串统计 当前题 最大异或对 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010,M31*N;// M 表示节点个数,每一个数最多有 31 位int n; int a[N]; i…...
剑指 Offer II 031. 最近最少使用缓存
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20031.%20%E6%9C%80%E8%BF%91%E6%9C%80%E5%B0%91%E4%BD%BF%E7%94%A8%E7%BC%93%E5%AD%98/README.md 剑指 Offer II 031. 最近最少使用缓存 题目描述 运用所掌握的…...
Windows 11【1001问】查看Windows 11 版本的18种方法
随着技术的飞速发展,操作系统作为连接硬件与软件的核心桥梁,其版本管理和更新变得尤为重要。对于用户而言,了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能,还能确保安全性和兼容性。然而,不同场景和需…...
小程序性能优化-预加载
在微信小程序中,数据预加载是提升用户体验的重要优化手段。以下是处理数据预加载的完整方案: 一、预加载的适用场景 跳转页面前的数据准备 如从列表页进入详情页前,提前加载详情数据首屏加载后的空闲时间 在首页加载完成后,预加载…...
vue3中展示markdown格式文章的三种形式
一、安装 # 使用 npm npm i kangc/v-md-editor -S# 使用yarn yarn add kangc/v-md-editor二、三种实现形式 1、编辑器的只读模式 main.ts文件中配置: import VMdEditor from kangc/v-md-editor; import kangc/v-md-editor/lib/style/base-editor.css;const app …...
(视频教程)Compass代谢分析详细流程及python版-R语言版下游分析和可视化
不想做太多的前情解说了,有点累了,做了很久的内容,包括整个分析,从软件安装和报错解决到后期下游python版-R语言版下游分析和可视化!单细胞代谢分析我们写过很多了,唯独少了最“高级”的compass,…...
文件描述符与重定向
1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备,并返回一个文件描述符,通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件,具体行为取决于传递给它的参数。 需要包含的头文件…...
为什么深度学习选择Tensor而非NumPy数组?核心优势深度解析
简短总结: 支持 GPU 加速:Tensor 提供对 GPU 的原生支持,能够有效加速计算,而 NumPy 则通常只能在 CPU 上运行。支持自动求导:深度学习模型的训练依赖于参数的优化,而 Tensor 提供了自动求导功能ÿ…...
python把html网页转换成pdf标题没有乱码,正文都乱码
在使用Python将HTML网页转换成PDF时,遇到标题没有乱码但正文乱码的问题,通常是由于字符编码处理不当或字体支持问题导致的。以下是一些可能的原因和解决方案: 原因分析 字符编码不匹配: HTML文件的编码与PDF转换工具或库所使用的…...
基于fast-whisper模型的语音识别工具的设计与实现
目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…...
详解:事务注解 @Transactional
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! Transactional 是 Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使用…...
场内、场外期权怎么开户?期权佣金是多少?
期权交易需要一定的知识和经验,以有效管理风险和制定策略。 场内期权开户(以50ETF为例) 场内期权开户的各种方式大差不差,咱们就先以50ETF期权为例子看下。 场内期权开户条件包括: 首先是资金的要求,50万…...
Linux:进程概念
目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程? 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al 5…...
Rabbit MQ 高频面试题【刷题系列】
文章目录 一、公司生产环境用的什么消息中间件?二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?三、解耦、异步、削峰是什么?四、消息队列有什么缺点?五、RabbitMQ一般用在什么场景?六、简单说RabbitMQ有哪些角…...
破解密码防线:渗透测试中的密码攻击手法汇总
密码是网络安全中的一道重要防线,然而,若密码策略不严密,往往会为攻击者提供可乘之机。本文将简要介绍渗透测试中关于密码的几种常见攻击思路和手法。 1. 确认使用默认及常见的账号密码 在渗透测试的初期,攻击者通常会尝试使用系…...
大模型在白血病诊疗全流程风险预测与方案制定中的应用研究
目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与白血病相关知识 2.1 大模型技术原理与特点 2.2 白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.3 根据…...
5-2JVM内存的各种应用
一、堆区(Heap)——对象实例的存储池 实际应用场景: 对象实例化:所有通过 new 关键字创建的对象实例均存储在堆中。例如: java Person person new Person(“张三”); // person对象实例分配在堆区1,4,6 大对象直…...
【NLP 28、一文速通NLP文本分类任务 —— 深度学习】
目录 一、深度学习 — pipeline 流水线 1.配置文件 config.py Ⅰ、路径相关 Ⅱ、模型相关 Ⅲ、训练相关 2.数据加载 loader.py Ⅰ、类初始化 Ⅱ、加载数据并预处理 Ⅲ、文本编码 Ⅳ、对输入序列截断或填充 Ⅴ、返回数据长度 Ⅵ、返回对应索引位置元素 Ⅶ、加载词表 Ⅷ、封装数据…...
nvidia驱动更新,centos下安装openwebui+ollama(非docker)
查看centos内核版本 uname -a cat /etc/redhat-release下载对应的程序(这个是linux64位版本通用的) https://cn.download.nvidia.cn/tesla/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run cudnn想办法自己下一下,我这里是12.x和11.x通用的…...
UnrealEngine UE5 可视化 从地球观察火星 金星 土星 运动轨迹
视频参考:https://www.bilibili.com/video/BV1KpXSYdEdo/ 从地球观察土星的运动轨迹 从地球观察火星 轨迹 从地球观察金星的运动轨迹...
蓝桥杯 五子棋对弈
五子棋对弈 问题描述 “在五子棋的对弈中,友谊的小船说翻就翻?” 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着"友谊第一,比赛第二"的宗旨ÿ…...
springmvc热点面试题开胃菜
1. Spring MVC的核心组件有哪些?它们的作用是什么? 答案: Spring MVC的核心组件包括以下部分,每个组件都有其特定的作用: DispatcherServlet: 前端控制器,是Spring MVC的核心。它负责接收所有H…...
关于深度学习的一份介绍
在这篇文章中,我将介绍有关深度学习的东西,主要是它与神经网络的关系、目前主要的网络有哪些,以及加深神经网络的意义等。 一、联系 在之前的文章中,我曾介绍过神经网络,而所谓的神经网络其实就是深度学习的一种架构…...
JavaScript系列02-函数深入理解
本文介绍了JavaScript函数相关知识,包括 函数声明与函数表达式 - 解释两者的区别,提升行为,以及使用场景箭头函数特性 - 讲解语法、词法this、不能作为构造函数等特点this绑定机制 - 详细讲解四种绑定规则:默认绑定、隐式绑定、显…...
