首页 > 其他分享 >Maven uber-jar(带依赖的打包插件) spring-boot-maven-plugin

Maven uber-jar(带依赖的打包插件) spring-boot-maven-plugin

时间:2023-12-25 21:23:47浏览次数:46  
标签:uber 插件 plugin Jar boot jar maven spring


转载自:https://blog.csdn.net/Ares5kong/article/details/128791102

文章目录

 

本文是对 spring-boot-maven-plugin 常用配置的介绍,更详细的学习请参照 Spring Boot Maven Plugin 官方文档

通过使用 spring-boot-maven-plugin 插件进行 Maven 的打包操作,可以将项目中依赖的 Jar 包一同添加到最终的项目 Jar 包内,这个插件有很多执行目标,对于打包来说,主要使用 repackage目标,建议使用时与 Maven 生命周期的 package 阶段绑定

不管 pom.xml 是否声明了 Maven 的默认打包插件 maven-jar-plugin,也不管是否声明了其他打包插件,maven-jar-plugin 都会在 package 阶段最先执行,而 spring-boot-maven-plugin 插件的 repackge 目标,正是对 maven-jar-plugin 打包后的 Jar 包进行二次打包,同时将项目依赖的 Jar 添加进去

这中打包后带依赖的 Jar 包一般称为 uper-jarfat-jar


最基础的 spring-boot-maven-plugin 使用

这个插件的最基础使用方式非常简单,pom.xml 中添加如下配置即可,重点在 15~29 行:

<!-- 模拟项目使用了依赖 -->
<dependencies>
    <!-- 依赖 commons-lang3 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>

<!-- 对项目构建进行配置 -->
<build>
    <plugins>
    	<!-- 引入 spring-boot-maven-plugin 插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.7.RELEASE</version>
            <executions>
                <execution>
                	<!-- 绑定 Maven 生命周期的 package 阶段 -->
                    <phase>package</phase>
                    <goals>
						<!-- package 阶段执行时,让其调用插件的 repackage 目标 -->
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

上面的配置添加后,我们就可以在 pom.xml 的所在目录运行 Maven 生命周期命令 mvn package,当命令运行后,会将打包结果存放到 ${project.build.directory} 中(默认是 target 目录),如下图:

spring打包

上图中,我们重点关注两个文件:

  • ares5k-package-1.0-SNAPSHOT.jar:spring-boot-maven-pluginmaven-jar-plugin 生成的 Jar 包进行二次打包后的 Jar 包,这个 Jar 包内已经包函项目的依赖了

  • ares5k-package-1.0-SNAPSHOT.jar.original:原始 Jar 包,maven-jar-plugin 生成的不包含项目依赖的 Jar 包,spring-boot-maven-plugin 为了避免原始 Jar 包和新 Jar 包名字冲突,对原始 Jar 包进行了重命名,添加了 original 后缀

ares5k-package-1.0-SNAPSHOT.jar 进行解压后,可以在 \BOOT-INF\lib 目录内看到项目依赖的 Jar 包:

项目依赖

虽然配置中没有指定入口类,但是这个 Jar 包仍然是可执行的,其在打包时会在 ${project.build.outputDirectory}(默认是 target/classes) 目录中依次向内查找,直至找到 .class文件为止,那么这个 .class 文件就是我们的入口类并被添加到项目的 MANIFEST.MF 中,如果在同一目录内出现多个 .class 文件,那么最后一个会成为入口类,例如下图:

默认入口类


指定入口类

想打破 spring-boot-maven-plugin 自动查找入口类的规则,从而自定义入口类,参考 19~22 行配置即可 :

<build>
    <plugins>
        <!-- 引入 spring-boot-maven-plugin 插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.7.RELEASE</version>
            <executions>
                <execution>
                    <!-- 绑定 Maven 生命周期的 package 阶段 -->
                    <phase>package</phase>
                    <goals>
                        <!-- package 阶段执行时,让其调用插件的 repackage 目标 -->
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <!-- 修改插件属性 -->
            <configuration>
                <!-- 指定入口类 -->
                <mainClass>com.ares5k.AA</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

安装部署原始 Jar 包到仓库

配置 spring-boot-maven-plugin 后,当执行 mvn install 或 mvn deploy 时,会将带依赖的 Jar 包安装或部署到仓库,有时候我们希望测试方便所以希望本地的包是包函依赖的,而安装部署的是原始包,这时候就可以如下配置,20~23 行:

<!-- 对项目构建进行配置 -->
<build>
    <plugins>
        <!-- 引入 spring-boot-maven-plugin 插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.7.RELEASE</version>
            <executions>
                <execution>
                    <!-- 绑定 Maven 生命周期的 package 阶段 -->
                    <phase>package</phase>
                    <goals>
                        <!-- package 阶段执行时,让其调用插件的 repackage 目标 -->
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <!-- 修改插件属性 -->
            <configuration>
                <!-- 将原始包安装或部署到仓库 -->
                <attach>false</attach>
            </configuration>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

保持原始Jar包名称,为 spring-boot-maven-plugin 生成的Jar包添加名称后缀

前面演示了,spring-boot-maven-plugin 执行 repackage 后会将 原始 Jar 包 重命名为 .original 结尾的形式,如果想保持原始 Jar 包的名称,那么就需必须修改新 Jar 包的名称,不然会命名冲突,通过如下方式可以为 新 Jar 包 添加名称后缀,20~24 行:

<!-- 对项目构建进行配置 -->
<build>
    <plugins>
        <!-- 引入 spring-boot-maven-plugin 插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.7.RELEASE</version>
            <executions>
                <execution>
                    <!-- 绑定 Maven 生命周期的 package 阶段 -->
                    <phase>package</phase>
                    <goals>
                        <!-- package 阶段执行时,让其调用插件的 repackage 目标 -->
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <!-- 修改插件属性 -->
            <configuration>
                <!-- 给 spring-boot-maven-plugin 生成的 Jar 包添加名称后缀,
                设置后 原始 Jar 包就不会改名为 .original 形式了-->
                <!-- 这个地方名称随便写 -->
                <classifier>spring-boot</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

效果如下:

新Jar包添加名称后缀


打包时排除依赖

打包时排除不需要的依赖,20~29 行:

<!-- 对项目构建进行配置 -->
<build>
    <plugins>
        <!-- 引入 spring-boot-maven-plugin 插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.7.RELEASE</version>
            <executions>
                <execution>
                    <!-- 绑定 Maven 生命周期的 package 阶段 -->
                    <phase>package</phase>
                    <goals>
                        <!-- package 阶段执行时,让其调用插件的 repackage 目标 -->
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <!-- 修改插件属性 -->
            <configuration>
                <!-- 排除打包后不需要的依赖 -->
                <excludes>
                    <!-- 排除 commons-lang3 -->
                    <exclude>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-lang3</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

建议将生成的Jar解压后了解一下整体结构

spring-boot-maven-plugin 打包后的项目 Jar 包中,不仅仅只是添加了依赖的 Jar 包,还多了很多 Spring 自己的文件,比如 META-INF/MANIFEST.MF 中真正的入口类其实是 Spring 的类,并不是我们设置的入口类,而我们设置的入口类是被 Spring 的这个类调用后才运行起来的。还有很多小细节,感兴趣的建议将项目Jar 解压后,研究一下


与其他常用打包插件比较

除了 spring-boot-maven-plugin 之外,常用的打包插件还有 maven-jar-pluginmaven-shade-plugin,使用方法在我其他文章中也有记录,在此将它们作一个简单的比较

spring-boot-maven-plugin

spring-boot-maven-plugin 是 Spring 提供的一个 Maven 打包插件,可以通过 maven 的插件命令运行,但是一般习惯将它与 maven 生命周期绑定,然后通过 maven 生命周期命令运行,它的特点是可以将项目中依赖的 Jar 包添加到最终生成的项目 Jar 包中

spring-boot-maven-plugin 主要是对 maven-jar-plugin 生成的项目 Jar 包进行二次打包,并将项目依赖的 Jar 包添加进项目的 Jar 包中

maven-jar-plugin

maven 生命周期中 package 阶段的默认插件,不管是否在 pom.xml 中主动声明,也不管是否有其他的 package 阶段插件被绑定,其在 package 阶段都会被最先执行

使用 maven-jar-plugin 打包时,不会将依赖的 Jar 包添加到生成的项目 Jar 包中,所以当项目中使用依赖时,需要自己准备依赖的 Jar 包,这样 maven-jar-plugin 打出的项目 Jar 包才能被成功运行

maven-shade-plugin

maven-shade-plugin 也可以将项目的依赖打进最终的项目 Jar 包中,但是其与 spring-boot-maven-plugin 不同的是,spring-boot-maven-plugin 是直接将依赖的 Jar 包放进项目的 Jar 包中,而 maven-shade-plugin 则是将依赖的 Jar 包解压,然后将解压后的文件放进最终的项目 Jar 包中

maven-shade-plugin 将依赖的 Jar 包解压后添加到项目的 Jar 包中的做法,为 maven-shade-plugin 带来了另一个重要的功能 <重命名>,因为将依赖的 Jar 包解压后都是以文件形式存在,所以 maven-shade-plugin 支持对对依赖的某个具体文件进行重命名,maven-shade-plugin 在重命名时,不只是将文件名字修改,连我们项目中对其引用的地方都会一同修改

重命名的做法可以避免版本冲突,想详细了解的可以参考我 maven-shade-plugin 的文章

 

标签:uber,插件,plugin,Jar,boot,jar,maven,spring
From: https://www.cnblogs.com/wanghengbin/p/17926992.html

相关文章

  • Maven maven-jar-plugin
     Mavenmaven-jar-plugin转载自:https://www.jianshu.com/p/d44f713b1ec9作用:打包(jar)插件,设定MAINFEST.MF文件的参数,比如指定运行的Mainclass、将依赖的jar包加入classpath中等等,首先我们明确一点的是maven插件功能:compile、package、deploy...都是在${project.build.di......
  • Maven 打包插件 maven-jar-plugin
    转载自:https://blog.csdn.net/Ares5kong/article/details/128777500文章目录指定版本生成可执行Jar准备依赖,并指定依赖位置自动下载依赖的Jar文件打包时排除文件与其他常用打包插件比较 本文是对maven-jar-plugin常用配置的介绍,更详细的学习请参照Apac......
  • WPF Halcon机器视觉和运动控制软件通用框架,插件式开发,开箱即用 仅供学习!
    点我下载,仅供个人学习使用参考easyvision开发,集成几十个软件算子此版本以添加ui设计器。具体功能如上所示,可以自定义变量,写c#脚本,自定义流程,包含了halcon脚本和封装的算子,可自定义ui,通过插件形式开发很方便拓展自己的功能。......
  • 一些好用的maven插件介绍
     一些好用的maven插件介绍转载自:https://juejin.cn/post/7231527422200692794Maven插件是扩展Maven功能的方式之一,它可以帮助我们更轻松地管理依赖性、构建应用程序、运行测试和部署应用程序等。maven插件实在是太多了,我这里也介绍不完,仅仅以我使用过的也比较实用的给大家......
  • 这款IDEA插件用着确实爽
    IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。今天给大家介绍一款IDEA插件:Apipost-Helper-2.0。代码写完直接编辑器内调试、还支持生成接口文档、......
  • 免费IDEA插件推荐-Apipost-Helper
    IDEA插件市场中的API调试插件不是收费(FastRequest)就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用!这款插件由Apipost团队开发的,其官方介绍是:用于IDEA项目快速生成API文档,快速查询接口、接口代码功能,并支持在IDEA中进行API......
  • 不使用第三方插件自己写一个数字递增滚动组件
    开箱即用水贴专用哈哈哈封装NumberRoller.vue组件<template><div><span:style="fontColorSize">{{formattedValue||0}}</span></div></template><script>exportdefault{props:{rollNumber:{//......
  • 手写滑动同步滚动进度条jq插件
    因需要一种滑动显示内容,并且带可拖动的进度条,即下面这种效果 找了很多插件,总有地方不能满足需求。于是决定自己手写,下面为完整源码:swiper.js1$.swiperCalculator=function(wrap,drag){2this.wrap=wrap;3this.drag=drag;4this.dWidth=drag......
  • Cost Calculator Builder PRO v3.1.46 已注册 – WordPress 插件
    成本计算器生成器PROv3.1.46:WordPress插件全解析一、插件概述"成本计算器生成器PROv3.1.46"是一款强大的WordPress插件,专为需要创建报价、价格和项目估算表的用户设计。这款插件集成了众多高级功能,可帮助用户高效地管理他们的成本和价格,从而提供准确的报价估算。二、条......
  • Taurus .Net Core 微服务开源框架:Admin 插件【4-5】 - 配置管理-Mvc【Plugin-Admin 后
    前言:继上篇:Taurus.NetCore微服务开源框架:Admin插件【4-4】-配置管理-Mvc【Plugin-CORS跨域】本篇继续介绍下一个内容:系统配置节点:Mvc- Plugin- Admin 后台界面:配置界面如下: 配置说明如下:1、Admin.IsEnable:配置当前后台插件是否可用这是个很危险的开关:如果......