Maven学习(六) - 插件maven-shade-plugin

Maven Shade Plugin 使用详细说明 是 Apache Maven 提供的一个插件,用于将项目的所有依赖项打包成一个可执行的胖 JAR 文件。这种 JAR 包包含所有项目所需的依赖项,可以在不额外配置的情况下直接运行。在构建微服务、发布可执行应用时,使用胖 JAR 可以减少部署复杂度。是一个功能强大的插件,可以帮助你将项目及其依赖打包成一个胖 JAR 文件。在实际使用中,通过合并资源、排除签名文件和重命名包路径,可以构建出无冲突的可执行 JAR,从而简化部署流程。 阅读详情

网上有一些maven-shade-plugin替代maven-assembly-plugin的文章,原因是代maven-assembly-plugin打出的jar包中要么是不能设置Main-Class,要么spring的META-INF/spring.*文件相互覆盖了。对于这两个问题,maven-assembly-plugin在当前的版本(3.1.0)中都可以解决了(方法见https://my.oschina.net/u/2377110/blog/1584205)。

实际上这两个插件所针对的用途其实是有差异的,而它们与maven默认的maven-jar-plugin都是打包插件,简单的区别如下:

pluginfunction
maven-jar-pluginmaven 默认打包插件,用来创建 project jar
maven-shade-plugin用来打可执行包,包含依赖,以及对依赖进行取舍过滤
maven-assembly-plugin支持定制化打包方式,更多是对项目目录的重新组装

当你只想将项目打成一个可执行包时,maven-shade-plugin非常适合。一般情况下,pom文件中shade插件配置如下。

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-shade-plugin</artifactId>  
            <version>1.4</version>  
            <executions>  
                <execution>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>shade</goal>  
                    </goals>  
                    <configuration>  
                        <filters>  
                            <filter>  
                                <artifact>*:*</artifact>  
                                <excludes>  
                                    <exclude>META-INF/*.SF</exclude>  
                                    <exclude>META-INF/*.DSA</exclude>  
                                    <exclude>META-INF/*.RSA</exclude>  
                                </excludes>  
                            </filter>  
                        </filters>  
                        <transformers>  
                            <transformer  
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">  
                                <mainClass>com.lcifn.Application</mainClass>  
                            </transformer>  
                            <transformer  
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
                                <resource>META-INF/spring.handlers</resource>  
                            </transformer>  
                            <transformer  
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">  
                                <resource>META-INF/spring.schemas</resource>  
                            </transformer>  
                        </transformers>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  

shade插件绑定的是package生命周期目标,并设置com.lcifn.Application为Main-Class,以及将META-INF/spring.*文件合并(追加而非覆盖),并过滤掉所有依赖的META/INF中SF,DSA,RSA后缀文件。这里涉及到filter配置和transformer配置。

filters和artifactSet

Filter操作在打包时将jar包中的内容排除。它是以groupId:artifactId为标识,在filter内部可以使用<include>/<exclude>更细致地控制,既可以移除代码文件,也可以移除配置文件。

<!-- 按package过滤junit包 -->
<configuration>
    <filters>
        <filter>
        	<artifact>junit:junit</artifact>
        	<includes>
        		<include>junit/framework/**</include>
        		<include>org/junit/**</include>
        	</includes>
        	<excludes>
        		<exclude>org/junit/experimental/**</exclude>
        		<exclude>org/junit/runners/**</exclude>
        	</excludes>
        </filter>
    </filters>
</configuration>

如果想将整个jar包都过滤掉,可以使用<artifactSet>,也是指定groupId:artifactId的标识。

<configuration>
	<artifactSet>
		<excludes>
			<exclude>classworlds:classworlds</exclude>
			<exclude>junit:junit</exclude>
			<exclude>jmock:*</exclude>
			<exclude>*:xml-apis</exclude>
			<exclude>org.apache.maven:lib:tests</exclude>
			<exclude>log4j:log4j:jar:</exclude>
		</excludes>
	</artifactSet>
</configuration>

另外配置<minimizeJar>将项目中没有使用的依赖自动移除

<configuration>
    <minimizeJar>true</minimizeJar>
</configuration>

<minimizeJar>可以和<filters>共同使用

<configuration>
	<minimizeJar>true</minimizeJar>
	<filters>
		<filter>
			<artifact>log4j:log4j</artifact>
			<includes>
				<include>**</include>
			</includes>
		</filter>
		<filter>
			<artifact>commons-logging:commons-logging</artifact>
			<includes>
				<include>**</include>
			</includes>
		</filter>
	</filters>
</configuration>

资源转换

在打包时,存在将多个构件中的class文件或资源文件聚合的需求。shade插件提供了丰富的Transformer工具类。这里介绍一些常用的Transformer。

ManifestResourceTransformer

往MANIFEST文件中写入Main-Class是可执行包的必要条件。ManifestResourceTransformer可以轻松实现。

<configuration>
	<transformers>
		<transformer
			implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
			<mainClass>com.lcifn.Application</mainClass>
		</transformer>
	</transformers>
</configuration>

AppendingTransformer

用来处理多个jar包中存在重名的配置文件的合并,尤其是spring。

<configuration>
	<transformers>
		<transformer
			implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
			<resource>META-INF/spring.handlers</resource>
		</transformer>
		<transformer
			implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
			<resource>META-INF/spring.schemas</resource>
		</transformer>
	</transformers>
</configuration>

ServicesResourceTransformer

JDK的服务发现机制是基于META-INF/services/目录的,如果同一接口存在多个实现需要合并 ,则可以使用此Transformer。

<configuration>
  <transformers>
    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
  </transformers>
</configuration>

更多的Transformer见http://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html

原始构件与shade构件

默认情况下,shade插件会覆盖基于项目的jar包,而生成包含所有依赖的jar包。但有时需要原始的jar包和shade后的jar包同时被部署,可以配置如下。

<configuration>
  <shadedArtifactAttached>true</shadedArtifactAttached>
  <!-- 名称会作为后缀在shade构件jar包后 -->
  <shadedClassifierName>jackofall</shadedClassifierName> 
</configuration>

参考:

  1. http://maven.apache.org/plugins/maven-shade-plugin/index.html
  2. http://www.jianshu.com/p/14bcb17b99e0
Maven常用的编译、打包方式总结 在提交大数据作业到集群上运行时,通常需要先将项目打成 JAR 包。这里以 Maven 为例,常用打包方式如下: 不加任何插件,直接使用 mvn package 打包; 使用 maven-assembly-plugin 插件; 使用 maven-shade-plugin 插件; 使用 maven-jar-plugin 和 maven-dependency-plugin 插件; 以下分别进行详细的说明。 阅读详情

相关推荐

Maven 构建 Flink 应用程序的最佳实践(根除各种类冲突/类加载问题)

作为开发者,在构建 Flink 应用程序时的体验真是一言难尽,想必大家都曾遇到过各种 ClassNotFoundException、NoSuchMethodError 以及 Could not find any factory for identifier kafka/jdbc/hive/hudi that implements org.apache.flink.table.factories.DynamicTableFactory in the classpath 这样的错误。坦率地说,Flink 的应用

Laurence的技术博客 2853

【工作笔记】- maven-shade-plugin打包合并META-INF/services

Maven按照POM依赖声明的先后顺序, 只加载了第一个services文件中的内容,后面的两条都被忽略掉了,导致运行报错。之前被忽略掉的services实现类已经都被加上去了 ,再运行jar包, 恢复正常了。

马路上开飞机 4266

ANSYS ICEM CFD 2023R2 结构化网格实战:翼型绕流 10 步生成高质量六面体网格

在计算流体力学(CFD)分析中,网格质量直接决定了仿真结果的精度和收敛性。对于翼型绕流这类典型的外部流动问题,结构化网格因其规则的节点排列和优异的边界层捕捉能力,成为高精度模拟的首选方案。通过在后缘处添加局部H型拓扑,并将过渡区增长率降至1.1,最终使网格质量指标提升40%,计算收敛速度提高2倍。这印证了结构化网格在复杂流动模拟中的不可替代性——虽然初期投入时间较多,但能显著提升计算精度和稳定性。在开始网格划分前,合理的几何准备是确保后续流程顺利的关键。对于翼型绕流,O型网格拓扑能提供最佳的边界层适应性。

weixin_30731305的博客 366

Maven专题(六) - 插件maven-shade-plugin

网上有一些maven-shade-plugin替代maven-assembly-plugin的文章,原因是代maven-assembly-plugin打出的jar包中要么是不能设置Main-Class,要么spring的META-INF/spring.*文件相互覆盖了。

iflink 6034

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 153

量子磁场测量技术在生物磁场成像领域的应用现状与产业趋势

首先对量子磁场测量技术的发展进行了简述,然后介绍了量子磁场测量技术在生物磁场成像领域的应用,最后分析了量子磁场测量技术的两大重要应用方向(心磁图仪和脑磁图仪)及其产业现状和未来发展趋势。美国普林斯顿大学在《自然》上公布了目前人类磁场测量灵敏度最高的基于量子磁场测量技术的零场原子磁力计。拥有巨大的发展潜力及庞大的市场空间。因此其数千万元的高昂售价及每年数百万元的超导维护成本限制了超导式心磁图仪的发展和临床应用。而基于超导式脑磁图仪的癫痫、阿尔兹海默症、抑郁症等脑疾病患者的临床研究也取得丰富的研究成果。

罗伯特技术屋 1531

maven-shade-plugin介绍及使用

基本功能 maven-shade-plugin提供了两大基本功能: 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的); 对依赖的jar包进行重命名(用于类的隔离); Goals maven-shade-plugin 只存在一个goal shade:shade,需要将其绑定到 phase package 上,使用框架如下: &lt;project&gt...

04stone37 8万+

跨境TRS投资实战:从开户到交易的完整系统解析

本文系统解析了跨境TRS(总收益互换)投资的完整实战流程。详细阐述了TRS作为境外资金投资A股的灵活工具,如何通过其独特的合约结构绕开港股通限制,并提供杠杆效应。内容涵盖从选择机构、开通账户、资金管理到核心交易操作的全过程,并强调了构建包含策略、风控与心态的完整投资系统的重要性。

weixin_29233333的博客 314

Maven打包插件之——maven-jar-plugin、maven-assembly-plugin、maven-shade-plugin

1. 打包插件的介绍 打包插件是把class文件,配置文件打包成一个jar(war或者其他格式)的包。而且可执行jar包中包含或者不包含相应的依赖包包,当不包含相应的依赖包时,我们需要建立lib目录,且jar和lib目录在同级别目录。 2. 常见的打包插件 2.1maven-jar-plugin 可执行jar包与依赖包是分开的,需要建立li...

calm_encode的博客 4184

光模块基础知识【快速入门】02

光模块是用于交换机与设备之间传输的载体,是光纤通信系统中的核心器件。主要作用是发射端将设备的电信号转换成光信号。 光纤通道光模块和以太网光模块 光纤通道光模块 光纤通道(FC, Fiber Channel)是一种高速网络数据传输协议。光纤通道协议可以有序无损地传输原始数据,它主要用于在数据中心、电脑服务器、交换机与存储网络中进行数据传输。 FC光模块遵循FC协议,充当着光纤通道系统之间的接口,也是光纤存储网络设备间的接口。它们主要用于数据中心的光纤通道存储网络链接中。 FC光模块具有小型化和低.

Jin Hanquan的博客 3万+

6、直流微电网中恒功率负载(CPL)的稳定性分析与控制策略

本文探讨了直流微电网中恒功率负载(CPL)带来的稳定性问题,并深入分析了其影响机制及相应的缓解策略。文章首先通过小信号模型和非线性分析揭示了CPL对系统稳定性的影响,接着讨论了被动稳定方法的优缺点,最后重点介绍了基于时间的方法和几何控制器等控制策略。这些方法各有优劣,在实际应用中需结合具体需求选择合适方案,以实现直流微电网的稳定运行。

star的博客 227

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

带依赖的打包插件 maven-shade-plugin

Ares5k 3516

新大陆NVH200-AP(U)扫码枪在上位机软件开发中的应用

由于本次使用的是USB接口的扫码枪。

qq_34059233的博客 2368

maven-shade-plugin - 解决 Jar 包冲突新思路

maven-shade-plugin 是 Maven 官方网站中提供的一个插件,官方文档中定义其功能如下:简单来说就是将依赖的包在 Package 阶段一起打入 Jar 包中,以及对依赖的 Jar 包进行重命名从而达到隔离的作用。这里为了解决上面的问题我们主要使用第二个功能特性,使得相同依赖不同版本达到共存的目的。

栗筝i的博客 5493

团体程序设计天梯赛竞赛题--登顶题【L3-039 攀岩】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 654

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

maven-shade-plugin详解

maven-shade-plugin详解介绍为uber-jar选择内容类重定位(解决jar包冲突)一个解决jar包冲突的例子Shaded Artifact附加名字可执行jar包 最近在解决java jar包冲突的时候用到了shade插件,于是从官网仔细看了下shade的详细使用,翻译总结如下,希望能用得到。 介绍 Apache maven shade plugin提供把工程的artifact及其依赖打包到一个uber-jar中并能隐藏起来(比如重命名),shade插件仅仅有一个功能就是创建一个shaded包

u011624157的专栏 9587

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Maven Shade Plugin 插件使用说明

依赖冲突解决:在大型项目中,可能会有多个库包含相同版本的依赖,但由于不同的作用域(compile, provided, runtime 等)或不同的版本,这些依赖可能会冲突。maven-shade-plugin 在创建 uber-jar 时,会尝试解决这些冲突,并生成一个简化后的 POM 文件,该文件只包含实际需要的依赖版本。简化依赖结构:生成的 dependency-reduced-pom.xml 文件只包含最终项目中实际使用的依赖项和它们的版本,这对于确保构建的可重复性和清晰性非常有用。

prcyang的专栏 1192

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

maven-assembly-plugin 和 maven-shade-plugin 比较

maven-assembly-plugin 和 maven-shade-plugin Flink scala 打包报错 Exception in thread "main" com.typesafe.config.ConfigException$UnresolvedSubstitution: reference.conf @ jar:file:/Users/wending/IdeaProject...

csdn问鼎 3871

Apache maven shade plugin使用说明

introductionApache maven shade plugin提供把工程的artifact及其依赖打包到一个uber-jar中并能隐藏起来(比如重命名),shade插件仅仅有一个功能就是创建一个shaded包。 那什么是uber-jar呢,uber在德语中是above或over的意思,在这里表示是从单一的jar提升到“over-jar”,即把所有的依赖都定义到一个jar文件里。 好了

星辰大海,脚踏实地 2万+

maven-shade-plugin 使用体验

0. 使用 maven 管理项目一开始方便,但是随着依赖越来越多就会越来越麻烦。 最头痛的问题就是依赖冲突,做为最终使用方可以通过 <exclusions> 解决,但是作为 sdk 的提供方就更麻烦了,搞不好就会被使用方 diss。 最近发现了一个神奇的 maven 插件 —— maven-shade-plugin —— 非常适合解决这类问题。 1. maven-shade-p...

z69183787的专栏 6913

解决项目版本冲突——maven-shade插件使用

文章目录背景maven-shade-plugin介绍解决问题1.环境准备2.解决方案3.引入依赖一些需要注意的坑maven-shade-plugins的其他使用 背景 当我们在maven项目中引入第三方组件时,三方组件中的依赖可能会与项目已有组件发生冲突。 比如三方组件中依赖httpclient的版本是4.5.x,而项目中已有的httpclient版本是3.1.x,那么此时就会产生一下两种情况: 如果用三方组件的高版本httpclient覆盖原有的低版本httpclient,有可能会导致原来项目启动运行失

SK_Jaco的博客 6959

maven-shade-plugin 插件简介

这句话简单的概述了1,将依赖的jar包打包时传入到当前classes目录(默认在lib文件下)。2,将依赖的jar包重命名,比如你在当前项目中依赖了tomcat-9.0的jar包,但是需求是需要项目在tomcat-8.5中允许,在出现版本冲突的时候,你可以使用maven-shade-plugin将你依赖的tomcat-9.0的jar包重命名并添加至你的classes目录下。L(.+);" );return!suffix = ";break;break;

小单的博客专栏 1524
上一篇: gradle编译还去下载
下一篇: Maven学习(四) - 插件maven-resources-plugin
lcathm
博客等级 码龄18年 37粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值