spring-boot-maven-plugin插件详解

news2024/12/22 19:38:59

一、 为什么Spring Boot项目自带这个插件

当我们在SpringBoot官方下载一个脚手架时,会发现pom.xml会自带spring-boot-maven-plugin插件

那为什么会自带这个插件呢?

我们知道Spring Boot项目,是可以通过java -jar 包名启动的

打包命令

mvn clean package

打包成功后就会生成一个jar包

请添加图片描述

试下是否可以通过java -jar 包名启动项目

请添加图片描述

发现是可以正常启动。

这个时候我们去掉spring-boot-maven-plugin插件,通过 mvn clean package 再打一次包。

打包依然成功,包名也一样,只是jar包大小有着天壤之别

请添加图片描述

发现只有3KB,之前的有17.7MB。

我们通过java -jar 包名看能否启动成功。

localhost:target xub$ java -jar maven-plugin-0.0.1-SNAPSHOT.jar maven-plugin-0.0.1-SNAPSHOT.jar中没有主清单属性

发现并不能启动成功,这是为什么呢?

一般的maven项目的打包命令,不会把依赖的jar包也打包进去的,只是会放在jar包的同目录下,能够引用就可以了。

但是spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去。该文件包含了所有的依赖和资源文件,可以直接在命令行或者传统的 Java Web 服务器上启动运行。

二、插件介绍

1、插件标签详解

<!--使用的插件列表 。 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
	<!--插件在仓库里的group ID -->
	<groupId />
	<!--插件在仓库里的artifact ID -->
	<artifactId />
	<!--被使用的插件的版本(或版本范围) -->
	<version />
	<!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。 -->
	<extensions />
	<!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
	<executions>
		<!--execution元素包含了插件执行需要的信息 -->
		<execution>
			<!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
			<id />
			<!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
			<phase />
			<!--配置的执行目标 -->
			<goals />
			<!--配置是否被传播到子POM -->
			<inherited />
			<!--作为DOM对象的配置 -->
			<configuration />
		</execution>
	</executions>
	<!--项目引入插件所需要的额外依赖 -->
	<dependencies>
		<!--参见dependencies/dependency元素 -->
		<dependency>
			......
		</dependency>
	</dependencies>
	<!--任何配置是否被传播到子项目 -->
	<inherited />
	<!--作为DOM对象的配置 -->
	<configuration />
</plugin>
</plugins>

2、内部goals

该插件提供了7个maven goal

  • build-image: 将程序使用 buildpack 打包进容器镜像中。
  • build-info:生成项目的构建信息文件 build-info.properties
  • help:显示帮助信息。调用mvn spring-boot:help -Ddetail=true -Dgoal=以显示参数详细信息。
  • repackage:可生成可执行的jar包或war包。插件的核心goal。
  • run:运行 Spring Boot 应用
  • start:在集成测试阶段,控制生命周期
  • stop:在集成测试阶段,控制生命周期

请添加图片描述

为什么这里插件名称叫spring-boot?

原因:自定义插件如果遵循 xxx-maven-plugin 的形式,maven 默认会将 maven-plugin 前面的内容作为插件前缀。

三、该插件常见使用场景

1、排除provided类型的依赖

默认情况下,repackage命令所生成的包,会把项目中所有的依赖都打进去。

但其实在项目中scope为provided的依赖,比如 lombok、mybatis-plus等,只作用于编译阶段,编译完成就没用了。

若除去provided依赖,可以使用如下的配置:

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>
		spring-boot-maven-plugin
	</artifactId>
	<configuration>
		<excludes>
			<exclude>
				<groupId>org.projectlombok</groupId>
				<artifactId>lombok</artifactId>
			</exclude>
		</excludes>
	</configuration>
</plugin>

2、指定Mainclass类

如果未指定,main将使用找到的第一个包含方法的编译类。

也就是说如果只有一个main方法,那不需要去指定,如果你这个模块存在两个主类,那么就需要在插件中指定具体哪个启动类了。

<plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
       <configuration>
                <mainClass>com.can.mavenplugin.MavenPluginApplication</mainClass>
                <layout>ZIP</layout>
        </configuration>
</plugin>

layout 属性用来指定打成 jar 还是war 文件,可用的值包括:ZIP 、JAR 、WAR、 NONE 。默认JAR

3、在使用spring-boot-maven-plugin的下生成普通的jar包

前面说了,如果使用该插件,那么打出来的包是一个可执行的jar包,这样的jar包,在被别的项目引用的时候,可能会出问题。

那如何打成一个普通的jar包。

当然你可以把这个插件注释掉,重新打包。不过这样做未必太愚蠢啦。

解决办法

第一种:通过命令

mvn clean package -D spring-boot.repackage.skip=true

加上-Dspring-boot.repackage.skip=true参数即可,此时只会生成一个普通的jar包

第二种:通过配置

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<configuration>
		<skip>true</skip>
	</configuration>
</plugin>

这两种方式打出来的包就是没有依赖jar的普通包了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

冠达管理:“股债汇”三杀!总统大选结果意外,这国汇率暴跌两成

当地时间8月14日&#xff0c;美股三大股指全线收涨&#xff0c;纳指涨超1%。本周商场重视多家重要零售商的财报与7月零售出售数据。 大型科技股大都上涨&#xff0c;英伟达低开高走涨7.09%&#xff0c;创5月26日以来最大单日涨幅&#xff0c;早盘总市值一度跌破万亿美元。摩根士…

QQ附近人引流的几个详细方法,qq附近人引流脚本实操演示教程

大家好我是你们的小编一辞脚本&#xff0c;今天给大家分享新的知识&#xff0c;很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码&#xff0c;给大家分享一下qq引流脚本的知识和视频演示 不懂的小伙伴可以认真看一下&#xff0c;我们一…

idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵

问题一&#xff1a;全局搜索快捷键ctrlshiftf 突然失灵了&#xff0c;键盘敲烂了 都没反应&#xff0c;这是为什么呢&#xff1f; 肯定不是idea本身的原因&#xff0c;那么就是其它外在因素影响到了idea的快捷键&#xff0c;那么其它的快捷键为什么没失效呢&#xff0c;原因只有…

煜邦转债,华设转债,兴瑞转债,神通转债上市价格预测

煜邦转债 基本信息 转债名称&#xff1a;煜邦转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;4.10806亿元。 正股名称&#xff1a;煜邦电力&#xff0c;今日收盘价&#xff1a;8.82元&#xff0c;转股价格&#xff1a;10.12元。 当前转股价值 转债面值 / …

nodejs+vue+elementui医院电子病历管理系统5a4x5

此系统任何人都可以使用&#xff0c;哪怕对代码完全不懂&#xff0c;只会电脑的基础操作并且安装这几款软件就可以对本系统进行操作&#xff0c;实现了人员使用方面的自由&#xff0c;不必有过多的限制。 语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;…

安卓快速开发

1.环境搭建 Android Studio下载网页&#xff1a;https://developer.android.google.cn/studio/index.html 第一次新建工程需要等待很长时间&#xff0c;新建一个Empty Views Activity 项目&#xff0c;右上角选择要运行的机器&#xff0c;运行就安装上去了(打开USB调试)。 2…

冠达管理:融券卖出交易规则?

融券卖出买卖是指投资者在没有实际持有某只股票的情况下&#xff0c;经过借入该股票并卖出来取得赢利的一种股票买卖方式。融券卖出买卖规矩针对不同市场、不同证券公司之间可能会存在一些差异&#xff0c;但基本的规矩包含如下几个方面。 一、融资融券的资历要求 在进行融券卖…

滑模控制器理论推导和matlab/simulink实例分享

滑模控制的运动轨迹主要分为两个方面&#xff1a;(1)系统的任意初始状态向滑模面运动阶段&#xff1b;(2)系统到达滑模面后并且慢慢趋于稳定的阶段。所以&#xff0c;对于滑模变结构控制器的设计&#xff0c;对应于系统运动的两个阶段&#xff0c;可以分为两个部分&#xff1a;…

无为WiFi代理说明

无为WiFi代理说明 欢迎加入无为WiFi共荣圈&#xff0c;无为不坑&#xff0c;不骗&#xff0c;无为真实案例&#xff0c;加入无为的从来没有吃过亏。 你所看见的是【无为WiFi】代理说明&#xff0c;意思就是你代理无为WiFi&#xff0c;可以向需要使用无为WiFi的用户出售无为Wi…

亚马逊测评工作室怎么做?

亚马逊是全球最大的电商平台之一&#xff0c;任何一个卖家想要提升自己店铺的知名度和销量&#xff0c;都需要关注自己Listing的Review数量和星级评价&#xff0c;而测评对于卖家账号的评定和产品曝光量有着重要影响&#xff0c;可以用于店铺提升销量&#xff0c;留评等 在进行…

大数据Flink(六十三):SqlClient工具的使用

文章目录 SqlClient工具的使用 一、​​​​​​​入门

场景入门11----浮空岛,添加样条组件

模型 可以让浮空岛按特定曲线运动 首先将浮空岛模型导入蓝图&#xff0c;添加样条组件。在场景中可以拉长绘制曲线&#xff0c;右键添加点 蓝图 添加一个时间轴&#xff0c;循环&#xff0c;高低往复&#xff0c;时间轴输出的是百分比乘上曲线的长度输出距离&#xff0c;让…

简单认识excel篇章1

excel是Office办公软件中的组件之一&#xff0c;它专长于对表格中的数据进行计算和统计管理&#xff0c;通常用于财务或其他数据管理的表格制作&#xff0c;同时excel还有很好的可视化能力&#xff0c;可用于制作各种行业报告。 在Microsoft Excel中&#xff0c;excel文件的后缀…

【软件工程质量】代码质量管理平台Sonar

分析代码质量的工具有挺多的&#xff0c;比如&#xff1a;Alibaba Java Coding Guidelines plugin、QAPlug、SonarQube 等&#xff0c;平时用的比较多的事Alibaba Java Coding Guidelines plugin和sonarlint。 SonarQube 是一个用于管理源码质量的平台&#xff0c;帮助开发者…

MySQL 中常见的几种高可用架构部署方案

MySQL 中的集群部署方案 前言 这里来聊聊&#xff0c;MySQL 中常用的部署方案。 MySQL Replication MySQL Replication 是官方提供的主从同步方案&#xff0c;用于将一个 MySQL 的实例同步到另一个实例中。Replication 为保证数据安全做了重要的保证&#xff0c;是目前运用…

反向代理与正向代理之间差异分析

在网络世界中&#xff0c;爬虫ip是我们常用工具之一。但你是否了解反向爬虫ip和正向爬虫ip之间的区别呢&#xff1f;本文将向你分享反向爬虫ip与正向爬虫ip的差异分析&#xff0c;帮助你更好地选择适合的爬虫ip方式&#xff0c;提升爬虫项目的实际操作价值。 首先我们来了解一下…

振弦传感器、采集仪及在线监测系统应用于地下隧道监测的完整案例

振弦传感器、采集仪及在线监测系统应用于地下隧道监测的完整案例 介绍 振弦传感器、振弦采集仪及在线监测系统是岩土工程监测领域中常见的设备&#xff0c;能够对钢筋混凝土结构进行实时、准确的监测。本文将介绍一套完整链条的岩土工程监测案例&#xff0c;包括振弦传感器、…

记录VS2022离线安装NuGet包的过程

离线安装NuGet包主要分为两个阶段&#xff1a;指定安装源及下载包及其依赖项。本文记录在VS2022中离线安装NuGet包的过程及注意事项。   离线安装NuGet包&#xff0c;主要有两种方式&#xff1a;1&#xff09;搭建局域网或本机NuGet服务器&#xff0c;将VS2022的源指定为NuGe…

【深度思考】聊聊CGLIB动态代理原理

1. 简介 CGLIB的全称是&#xff1a;Code Generation Library。 CGLIB是一个强大的、高性能、高质量的代码生成类库&#xff0c;它可以在运行期扩展Java类与实现Java接口&#xff0c; 底层使用的是字节码处理框架ASM。 Github地址&#xff1a;https://github.com/cglib/cgli…

掌握网络设备,畅游网络世界!

网络的搭建离不开网络设备&#xff0c;物理连接&#xff0c;以及设备之间的多种协议。其中在实现网络互通时&#xff0c;最常见的网络设备是路由器和交换机。 如今在各种级别的网络随处可见各种低、中、高端的路由器、交换机&#xff0c;种类繁多&#xff0c;这些不同种类的设备…