Spring Boot Maven Plugin -- repackage目标;spring-boot-maven-plugin的executable配置

2023-11-15

Spring Boot Maven Plugin – repackage目标

Spring Boot Maven Plugin插件提供spring boot在maven中的支持。允许你打包可运行的jar包或war包。

插件提供了几个maven目标和Spring Boot 应用一起工作。总的有:

spring-boot:repackage
spring-boot:run
spring-boot:start and spring-boot:stop 
spring-boot:build-info 

repackage:创建一个自动可执行的jar或war文件。它可以替换常规的artifact,或者用一个单独的classifier附属在maven构建的生命周期中。

下面我们详细看下repackage这个目标。
一、简单引用

用了重新打包应用程序,我们需要在pom.xml文件中加一个简单的引用到Spring Boot Maven Plugin插件中,代码如下:repaceage 最简单的结构

 1 <build>
 2   ...
 3   <plugins>
 4     ...
 5     <plugin>
 6       <groupId>org.springframework.boot</groupId>
 7       <artifactId>spring-boot-maven-plugin</artifactId>
 8       <version>1.5.7.RELEASE</version>
 9       <executions>
10         <execution>
11           <goals>
12             <goal>repackage</goal>
13           </goals>
14         </execution>
15       </executions>
16     </plugin>
17     ...
18   </plugins>
19   ...
20 </build>

repaceage 最简单的结构
二、剔除不需要的依赖

这个例子重新打包了一个jar包或war包,这个jar包或war包被构建于maven生命周期的package阶段,包括定义在工程中的任何依赖(包括scope为provided)。如果有一些依赖模块需要被排除掉,可以使用一个exclude的选项。

默认情况下,repackage和run这两个maven目标会包括定义在工程中的任何依赖。一些依赖被要求从可执行jar包中排除。下面有三种方式可以在包运行时排除依赖模块。

方式1::排除一个具体的maven 模块,通过唯一的groupId和artifactId组合来实现。(如果有必要,可以加入classifier来唯一确认。)

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <configuration>
12           <excludes>
13             <exclude>
14               <groupId>com.foo</groupId>
15               <artifactId>bar</artifactId>
16             </exclude>
17           </excludes>
18         </configuration>
19         ...
20       </plugin>
21       ...
22     </plugins>
23     ...
24   </build>
25   ...
26 </project>

排除一个具体的maven模块

方式2:排除和“指定的artifactId”相符的所有maven模块。

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <configuration>
12           <excludeArtifactIds>my-lib,another-lib</excludeArtifactIds>
13         </configuration>
14         ...
15       </plugin>
16       ...
17     </plugins>
18     ...
19   </build>
20   ...
21 </project>

排除和指定的artifactId项目的所有maven模块

方式3:排除属于“指定的groupId”的所有maven模块。

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <configuration>
12           <excludeGroupIds>com.foo</excludeGroupIds>
13         </configuration>
14         ...
15       </plugin>
16       ...
17     </plugins>
18     ...
19   </build>
20   ...
21 </project>

排除属于指定的groupId的所有maven模块
三、重写manifest

这个插件还可以重写项目的manifest (可运行jar包的MANIFEST.MF),特别是管理Main-Class和Start-Class启动类。如果默认的配置不能满足需求,我们可以在这里做配置。通过插件的layout属性可以确实地控制Main-Class。

 1 <build>
 2   ...
 3   <plugins>
 4     ...
 5     <plugin>
 6       <groupId>org.springframework.boot</groupId>
 7       <artifactId>spring-boot-maven-plugin</artifactId>
 8       <version>1.5.7.RELEASE</version>
 9       <configuration>
10         <mainClass>${start-class}</mainClass>
11         <layout>ZIP</layout>
12       </configuration>
13       <executions>
14         <execution>
15           <goals>
16             <goal>repackage</goal>
17           </goals>
18         </execution>
19       </executions>
20     </plugin>
21     ...
22   </plugins>
23   ...
24 </build>

repackage mainClass

执行打包命令:mvn package spring-boot:repackage。注意:这里不能写成mvn spring-boot:repackage。否则会报Source must refer to an existing file异常。

layout属性默认根据archive type(jar or war)而定。总的有5中类型:

JAR:常规的可执行jar包的布局。
WAR:可执行war包的布局。
ZIP(和DIR一样):和使用PropertiesLauncher的jar包布局一样。
MODULE:包括依赖包(排除scope为provided的依赖包)和项目资源
NONE:包括所有的依赖包和项目资源。 

四、利用classifier分离代码包和依赖包

当自己写项目需要发布出去给别人依赖时,就只需要自己写的代码打包,依赖的包不能打进来。否则最后别人在用你提供的包时,就会出现重复包,导致最后打包时包会非常巨大。

在这个Spring Boot Maven Plugin这个插件下,我们只需要提供classifier即可实现这个功能。具体如下:

1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.7.RELEASE</version>
11         <executions>
12           <execution>
13             <goals>
14               <goal>repackage</goal>
15             </goals>
16             <configuration>
17               <classifier>exec</classifier>
18             </configuration>
19           </execution>
20         </executions>
21         ...
22       </plugin>
23       ...
24     </plugins>
25     ...
26   </build>
27   ...
28 </project>

spring-boot-maven插件的repackage(goal)有如下两个作用:

1、在原始Maven打包形成的jar包基础上,进行重新打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),以此来满足Springboot独立应用的特性;
2、将原始Maven打包的jar重命名为XXX.jar.original作为原始文件;

打包插件pom:

<build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.7</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

注意:
1:pom中加入repackage打的是可执行的包,MANIFEST.MF有启动类,但是可执行的包不能作为依赖引入,引入这样的jar会报错找不到类。报错:com.oceansite.system.config.ShipImoConfig
2:pom中不加repackage打的是依赖包,不可执行,MANIFEST.MF中没有启动类,但是可以当作依赖jar包引入其他项目中。
3:打包插件版本应该和springboot版本一致,否则会报版本报错。如果子模块有引入其他模块。直接子模块打包会报错找不到这个依赖(因为会从仓库里去找),需要整个项目一起打包,才能打成功。
4:若依cloud 项目中,只需要的对应的模块的pom文件中加入打包插件就可以,比如:file,像models模块下就不需要(file是models模块下的子模块),因为只是起到文件夹的作用。而且pom文件的生效是由内而外的,如果本模块下pom没有引入,并在外层pom中找
5:如果你在没有主类的公共包的pom文件中强行加入repackage,打包时会报错:Unable to find main class

spring-boot-maven-plugin的executable配置

将这个配置设置为 true,打包出来的 jar/war 就是 可执行 的

完全可执行 的 jar/war 在文件前面嵌入了个 额外的脚本,这就使得有些命令会执行失败,比如 jar -xf 等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot Maven Plugin -- repackage目标;spring-boot-maven-plugin的executable配置 的相关文章

随机推荐

  • Rings‘ Power,性能“世界第一”的Web I/O框架

    UringNet设计的思路和参考 在2019年 从Linux内核5 1开始 引入了io uring这样的异步框架 io uring的设计非常精巧 经过验证 其性能极其强悍 在文件读写的领域已经证明了其巨大的价值 很多数据库系统的底层已经引入
  • 物联网会是下一个支柱产业吗?

    近年来 物联网 IoT 无疑已成为一个重要且快速增长的行业 尽管绝对确定地预测未来具有挑战性 但许多专家和分析师认为 物联网有潜力成为支柱产业 对各个行业产生变革性影响 物联网是指由可以收集 交换和分析数据的互连设备 传感器和系统组成的网络
  • C语言 二级指针的定义与理解

    二级指针定义格式 类型 指针名 例 int p 二级指针用于存储一级指针的内存地址 二级指针赋值实例 int p a int pp p 注意 只能同等类型赋值 不能不同类型赋值 例如 char p a int pp p 因为int占4字节
  • TortoiseGit回退还原指定提交的代码记录

    根据提交日志还原本地的代码 再将本地的代码提交 一 同步本地代码到最新 并查看提交日志 二 选中提交的记录 开始退回本地的代码 三 点击OK 本地代码回退完成 尽量不要点击commit 四 点击OK 查看本地已经退回还原的代码 是否准确 五
  • 计算机毕业设计中用python神经网络编程实现手写数字识别

    本文实例为大家分享了python实现手写数字识别的具体代码 供大家参考 具体内容如下 import numpy import scipy special import matplotlib pyplot class neuralNetwor
  • 浏览器地址栏更改url参数 页面还发送原url参数的请求bug修复

    在做定时刷新大屏的需求 需要定时发送一遍请求刷新最新数据 this timer setInterval gt that getFun1 that getFun2 that getFun3 that getFun4 60 1000 其中get
  • 【Unity疑难杂症#持续更新……】

    目录 1 Unity打包时 自定义shader没效果 2 Unity打包ios时动画不播放 3 Android Unable to merge android manifest Error 4 Unity打到刘海屏的Android手机上不能
  • php上传图片到MySQL数据库代码如下

    效果图入下 用到两个php文件 index php上传图片 img php获取图片 index php代码如下
  • 2023华为OD机试真题 C++【分奖金/单调栈】

    题目 代码 include
  • C++ 标准库

    C 标准库可以分为两部分 标准函数库 这个库是由通用的 独立的 不属于任何类的函数组成的 函数库继承自 C 语言 面向对象类库 这个库是类及其相关函数的集合 C 标准库包含了所有的 C 标准库 为了支持类型安全 做了一定的添加和修改 标准函
  • Seaborn系列教程(5)

    seaborn countplot 计数图 柱状图 解析 使用条形图 柱状图 显示每个分类数据中的数量统计 seaborn countplot x None y None hue None data None order None hue
  • 【Linux】缓冲区/磁盘inode/动静态库制作

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 缓冲区 1 缓冲区的概念 2 缓冲区的意义 3 缓冲区
  • 【mitmproxy】python gui工具与mitmproxy的结合使用

    mitmproxy介绍 mitmproxy是一款流行的开源工具 用于拦截 修改和检查网络流量 它可以在中间人攻击 Man in the Middle 的场景下用于分析 调试和测试网络应用程序 其他地方很多介绍 可以跳过 以下是mitmpro
  • linux内核oops错误码说明,调试 – 了解内核oops错误代码

    在ARM的内核oops中跟踪日志打印在内核日志中 lt 1 gt 4205 112835 I 0 swapper 0 0 c0 Unable to handle kernel paging request at virtual addres
  • FPGA开发(4)——AXI_LITE总线协议

    一 AXI总线简介 对于axi总线的学习我主要是参考了赛灵思的ug1037文档以及arm的INI0022D手册 对其中的内容做了总结 AXI是amba总线的一种 包含三种 axi full axi lite和axi stream AXI工作
  • 关于CentOS7虚拟机配置静态IP地址及ping不通通百度等官网

    一 IP地址的配置 1 查看MAC地址 点击 虚拟机 gt gt gt 设置 gt gt gt 网络适配器 gt gt gt 高级 gt gt gt 记住MAC地址 后面会用到 2 查看子网掩码和网关IP 点击 编辑 gt gt gt 虚拟
  • Vue极简使用

    Vue 安装Vue 模板语法 安装Vue 安装nodejs 这里我安装的是14 5 4版本 https nodejs org download release v14 15 4 解压后配置一下环境变量就行 安装cnpm镜像 这个安装的版本可
  • python小游戏——走出迷宫代码开源

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 游戏代码效果呈现 二 游戏主代码 1
  • 矩阵运算(一)最小二乘法

    最小二乘法 前言 最小二乘法拟合一元多项式的简单推导 进一步的思考 CPP开发者封装最小二乘法 QR分解 Matlab中使用QR分解 Python numpy中使用 参考文献 作者说 前言 最小二乘法在函数拟合的过程中广为应用 不少读者使用
  • Spring Boot Maven Plugin -- repackage目标;spring-boot-maven-plugin的executable配置

    Spring Boot Maven Plugin repackage目标 Spring Boot Maven Plugin插件提供spring boot在maven中的支持 允许你打包可运行的jar包或war包 插件提供了几个maven目标