使用maven-shade-plugin解决依赖版本冲突

项目里引入多个版本依赖时,最后只会使用其中一个,一般可以通过排除不使用的依赖处理,但是如果需要同时使用多个版本,可以使用maven-shade-plugin解决。

以最典型的poi为例,poi版本兼容性很低,如果出现找不到类或者类未定义之类的错误,一般就是因为poi版本不兼容。

项目有这样一个需求,需要使用poi-tl-ext实现word导出富文本,poi-tl-ext里使用的是poi 4.1.2,而原本项目里使用的是2.x,由于版本差异过大,使用新版本poi,会影响到系统的旧功能。

为了解决以上情况,需要同时使用两个版本的poi,之所以存在冲突,是因为存在同包同名的类,因此只要将其中一个包重命名,就可以解决冲突,maven-shade-plugin是一个打包工具,可以用这个工具重命名指定报名,并生成新的依赖包。

具体操作:

1、新建一个maven项目,在pom.xml中引入依赖,设置重命名规则

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.test</groupId><artifactId>shade</artifactId><version>4.1.2</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.22</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.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><relocations><relocation><pattern>org.apache.poi</pattern><shadedPattern>shade.org.apache.poi</shadedPattern></relocation><relocation><pattern>com.deepoove.poi</pattern><shadedPattern>shade.com.deepoove.poi</shadedPattern></relocation></configuration></execution></executions></plugin></plugins></build>
</project>

2、执行mvn package生成jar包

3、在项目里引入生成的jar包

<dependency><groupId>com.test</groupId><artifactId>shade</artifactId><version>4.1.2</version><scope>system</scope><systemPath>${project.basedir}/src/main/lib/shade-4.1.2.jar</systemPath>
</dependency>

4、需要使用4.1.2版本的poi类时,import重命名后的包名

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

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

相关文章

[CH582M入门第十一步]DS18B20驱动

学习目标: 1、介绍DS18B20 2、学习单总线 3、学习DS18B20程序驱动一、DS18B20介绍 DS18B20 是一款由 Maxim Integrated(原Dallas Semiconductor) 推出的 数字温度传感器,以其单总线(1-Wire)通信协议、高精度和广泛应用而闻名。以下是其核心特点和应用介绍: 主要特性 数…

SGLang + 分布式推理部署DeepSeek671B满血版

部署设备&#xff1a;28A100 80G&#xff0c;两台机器&#xff0c;每台机器8张A100。 模型&#xff1a;deepseek-671B-int8 模型下载地址&#xff1a;https://huggingface.co/meituan/DeepSeek-R1-Block-INT8 模型参考&#xff1a; 1、SGLang Docker部署 github地址&#…

PCL 间接平差拟合球

目录 一、算法原理 1、计算流程 2、参考文献 二、代码实现 三、结果展示 本文由CSDN点云侠原创,首发于2025年7月24日。博客长期更新,本文最新更新时间为:2025年7月24日。 一、算法原理 1、计算流程 空间球方程: ( x − a ) 2 + ( y − b ) 2 + ( z − c ) 2 = R 2 (1) (…

基于 HAProxy 搭建 EMQ X 集群

负载均衡器&#xff08;LB&#xff09;负责分发设备的 MQTT 连接与消息到 EMQ X 集群&#xff0c;采用 LB 可以提高 EMQ X 集群可用性、实现负载平衡以及动态扩容。 HAProxy简介 HAProxy 是一款高性能的 开源负载均衡器 和 反向代理服务器&#xff0c;主要用于在多个服务器之…

RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验

一直以来&#xff0c;龙蜥社区在 RISC-V 生态建设中持续投入&#xff0c;并积极贡献上游社区。多位龙蜥社区成员在 RISC-V 国际基金会担任主席/副主席角色&#xff0c;与来自阿里云、阿里达摩院、中兴通讯、浪潮信息、中科院软件所、字节跳动、Google、 MIT、Akeana 等企业的专…

CloudComPy使用PyInstaller打包后报错解决方案

情况描述 笔者在spec文件中&#xff0c;datas变量设置如下。如果你的报错类似于“找不到cloudComPy”&#xff0c;先尝试如下的设置。 datas[(CloudCompare,cloudComPy)], 笔者在打包完成后&#xff0c;打开软件发现报错&#xff1a; from cloudComPy import* ModuleNotFoun…

node.js中的path模块

在 Node.js 中&#xff0c;path 模块提供了处理和操作文件路径的功能&#xff0c;其中 path.join 和 path.resolve 是两个常用的方法。它们在处理路径时有不同的行为和用途: 功能概述 path.join()&#xff1a; 该方法主要用于将多个路径片段拼接成一个完整的路径字符串。它会正…

将Scrapy项目容器化:Docker镜像构建的工程实践

引言&#xff1a;爬虫容器化的战略意义在云原生与微服务架构主导的时代&#xff0c;​​容器化技术​​已成为爬虫项目交付的黄金标准。据2023年分布式系统调查报告显示&#xff1a;92%的生产爬虫系统采用容器化部署容器化使爬虫环境配置时间​​减少87%​​Docker化爬虫的故障…

Unity × RTMP × 头显设备:打造沉浸式工业远控视频系统的完整方案

结合工业现场需求&#xff0c;探索如何通过大牛直播SDK打造可在 Pico、Quest 等头显设备中运行的 RTMP 低延迟播放器&#xff0c;助力构建沉浸式远程操控系统。 一、背景&#xff1a;沉浸式远程操控的新趋势 随着工业自动化、5G 专网、XR 技术的发展&#xff0c;远程操控正在从…

HTTPS如何保障安全?详解证书体系与加密通信流程

HTTP协议本身是明文传输的&#xff0c;安全性较低&#xff0c;因此现代互联网普遍采用 HTTPS&#xff08;HTTP over TLS/SSL&#xff09; 来实现加密通信。HTTPS的核心是 TLS/SSL证书体系 和 加密通信流程。一、HTTPS 证书体系HTTPS依赖 公钥基础设施&#xff08;PKI, Public K…

数据的评估与清洗篇---清洗数据

处理前的准备 检查索引与列名 在处理内容之前,需要先看看索引或列名是否有意义,若索引和列名都是乱七八糟的,应该对他们进行重命名或者重新排序,以便我们理解数据。 清洗数据 清洗数据原则 针对数据内容,一般先解决结构性问题,再处理内容性问题。整洁数据的特点是: …

Ubuntu apt和apt-get的区别

好的&#xff0c;这是一个非常经典且重要的问题。apt install 和 apt-get install 的区别是很多 Ubuntu/Debian 新手都会遇到的困惑。 简单来说&#xff0c;它们的功能非常相似&#xff0c;但设计目标和用户体验不同。 一句话总结 apt 是 apt-get 的一个更新、更友好、更现代化…

多端适配灾难现场:可视化界面在PC/平板/大屏端的响应式布局实战

摘要精心设计的可视化大屏&#xff0c;在平板上显示时图表挤成一团&#xff0c;在PC端操作按钮小到难以点击&#xff0c;某企业的可视化项目曾因多端适配失败沦为“灾难现场”&#xff0c;不仅用户差评如潮&#xff0c;还被竞争对手嘲讽技术落后。多端适配真的只能靠“反复试错…

Vulnhub Web-Machine-N7靶机攻略(附VB安装教程)

1.VB安装 安装地址&#xff1a;https://download.virtualbox.org/virtualbox/7.1.12/VirtualBox-7.1.12-169651-Win.exe 下载好后直接打开即可开始安装。安装前先打开任务管理器&#xff08;搜索框直接搜索即可&#xff09;查看性能里面的虚拟化是否打开。 开始安装。 这里显…

vite搭建react-ts项目,@别名配置

vite搭建react-ts项目&#xff0c;别名配置一、配置别名二、输入/能索引文件三、解决找不到模块“/pages/home”或其相应的类型声明一、配置别名 vite.config.ts文件 import { defineConfig, loadEnv, type ConfigEnv, type UserConfig } from "vite"; import reac…

AWS OpenSearch 搜索排序常见用法

背景介绍 AWS OpenSearch是AWS的一个检索分析服务&#xff0c;是基于开源的Elasticsearch 7.x分支fork出来的独立的一个代码仓库&#xff0c;做了独立的维护&#xff0c;加入了一些自己的优化&#xff0c;本文在这里主要介绍是常见的基础用法 引入相关依赖<dependency>&l…

深度分析Java内存结构

Java内存结构是JVM的核心机制&#xff0c;直接关系到程序性能、并发能力和稳定性。下面从规范、实现到实践进行深度分析&#xff1a;一、JVM规范定义的内存区域 1. 程序计数器&#xff08;Program Counter Register&#xff09; 作用&#xff1a;存储当前线程执行的字节码指令地…

vs2019 创建MFC ActiveX的详细步骤

第一步 创建1个MFC ActiveX控件工程 添加方法 输入方法名称选择返回类型点击 添加参数&#xff0c;最后点击确认&#xff0c;如下图 添加的Add方法 注意&#xff0c;如需要添加1个指针类型的参数&#xff0c;需要手动输入* 最后编译&#xff0c;如编译出现下图错误&#xf…

pyarmor加密源代码

使用低版本python 避免出现加密限制&#xff0c;无法加密情况 环境&#xff1a;python3.9.9 安装 pyinsatller 及 pyarmor pip install pyinsatller pyarmor添加 其它pyinstaller 打包参数 一定在下边正式打包命令运行前执行 具体参考 https://pyarmor.readthedocs.io/zh/stabl…

MACOS安装配置Gradle

一、概述 gradle的运行高度依赖jvm版本&#xff0c;所以在安装之前一定要先安装jdk&#xff0c;同时gradle版本必须与jdk版本对应&#xff0c;不然在项目编译的时候会报版本不兼容导致编译不成功的问题。 官方说明地址 以下是官方列出关系对应版本的关系列表&#xff1a; 本文…