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

2023-05-16

文章目录

  • 背景
  • maven-shade-plugin介绍
  • 解决问题
    • 1.环境准备
    • 2.解决方案
    • 3.引入依赖
  • 一些需要注意的坑
  • maven-shade-plugins的其他使用

背景

当我们在maven项目中引入第三方组件时,三方组件中的依赖可能会与项目已有组件发生冲突。

比如三方组件中依赖httpclient的版本是4.5.x,而项目中已有的httpclient版本是3.1.x,那么此时就会产生一下两种情况:

  • 如果用三方组件的高版本httpclient覆盖原有的低版本httpclient,有可能会导致原来项目启动运行失败。即使高版本兼容低版本,也不能允许开发人员有这样高风险的操作
  • 如果在三方maven依赖中对其对依赖的httpclient在引入时使用进行排除,使三方组件使用项目中的低版本httpclient,此时可能会因为版本不一致导致三方组件无法使用

在这样的情况下我们应当如何保证不影响项目原有依赖版本的情况下正常使用三方组件呢?此时可以考虑使用maven-shade-plugin插件

maven-shade-plugin介绍

maven-shade-plugin在maven官方网站中提供的一个插件,官方文档中定义其功能如下:

This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies.

简单来说就是将依赖的包在package阶段一起打入jar包中,以及对依赖的jar包进行重命名从而达到隔离的作用。这里为了解决上面的问题我们主要使用第二个功能特性,使得相同依赖不同版本达到共存的目的。

解决问题

1.环境准备

这里用fastjson来模拟使用maven-shade-plugin解决项目中不同版本共存问题。原项目此时使用的是1.1.15版本的fastjson

<!-- 原项目 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.1.15</version>
</dependency>

假引入一个三方依赖,该依赖使用1.2.75版本的fastjson

<!-- 将引入依赖 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>

2.解决方案

搭建一个新的模块rename-dependencies,专门用于存放1.2.75依赖。在pom文件中添加1.2.75的依赖,然后添加maven-shade-plugin插件。rename-dependencies的pom如下

<?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">
    <groupId>com.sk</groupId>
    <artifactId>rename-dependencies</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</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>com.alibaba</pattern>
                                    <shadedPattern>shade.com.alibaba</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

从配置文件中可以看到,由于maven-shade-plugin插件在解决这个问题上其实是通过对依赖进行重命名而达到隔离的目的,所以配置主要是集中在relocations中。这里将以com.alibaba开头的包全部重命名为以shade.com.alibaba开头。

3.引入依赖

将rename-dependencies进行打包,打包好之后在原项目中引入rename-dependencies的依赖。此时在引入rename-dependencies之后,可以在项目下看到该依赖中的fastjson包名发生了变化
在这里插入图片描述

此时在代码中调用fastjson相关方法,会提示选择所需要包,如下图,此时问题解决,两个版本的fastjson可同时使用已经兼容。

在这里插入图片描述

一些需要注意的坑

  • 描述: 引入依赖找不到重命名的shade包

  • 原因:重命名的模块和需要引入依赖的模块在一个项目中,idea优先找本项目,所以没有走仓库

  • 解决方案:

    1. 将模块从项目maven中移除,右键项目-maven-unlink maven projects
    2. 新建一个项目专门来做依赖

maven-shade-plugins的其他使用

  • 打入和排除指定jar包。maven-shade-plugins还有个功能就是打入和排除指定的jar包,通过和指定。

官方配置示例

<project>
  ...
  <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>
              <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>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

官方配置示例

<project>
  ...
  <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>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>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
  • 排除包内资源。在上面的pom中使用maven-shade-plugin时,使用来对包内META-INF下的一些资源进行排除。如上面的配置中排除META-INF下的资源文件
<filters>
    <filter>
        <artifact>*:*</artifact>
        <excludes>
            <exclude>META-INF/*.SF</exclude>
            <exclude>META-INF/*.DSA</exclude>
            <exclude>META-INF/*.RSA</exclude>
        </excludes>
    </filter>
</filters>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决项目版本冲突——maven-shade插件使用 的相关文章

随机推荐

  • windows下使用powershell 操作服务器进行上传或下载

    1 上传文件使用scp命令 43 本地路径 43 服务器用户名称 64 服务器Ip xff1a 上传路径 2 下载文件到本地 使用scp命令 43 服务器用户名称 64 服务器Ip xff1a 文件路径 43 下载到本地的路径 最后的点表示
  • 佛系解决 DataBinding 无法生成 Activity****Binding 类

    起初呢 xff0c ActivityMainBinding 该类始终无法生成 于是确定一下几个地方 build gradle android dataBinding enabled 61 true 布局文件名称 lt layout gt l
  • 宇宙最强pyqt5的安装(一)!!!

    前期准备工作 xff1a pythonIDE3 5以上版本开发环境pycharm编程知识熟悉python基本语法 在线安装pyqt5 安装sip C Users xxx gt pip install sip Collecting sip D
  • Win10下部署TensorFlow以及一些避坑小指南

    第一步 xff0c 下载Anaconda3 Anaconda官网目前最新的版本是Python3 6的 xff0c 想要历史版本的 xff0c 去下面的网站下载 xff1a https repo continuum io archive 我们
  • SpringBoot如何整合邮箱服务实现登录验证功能

    写在前面 这里主要讲解大致思路 详细代码 xff08 目前部分功能还在开发完善中 xff09 请见这里 如果个人用户还是想白嫖短信服务的话 xff0c 可以看看我的这篇博客 一 开启 POP3 SMTP服务 获得的授权码 这里以qq邮箱为例
  • 手动创建和挂载SWAP分区

    手动创建和挂载SWAP分区 在安装系统的时候很难决定多大的交换空间 xff0c 往往需要根据服务器实际负载 运行情况 以及未来可能应用来综合考虑 swap 分区的大小 xff0c 所以这里参考推荐最小 swap 大小更实际一些 xff1a
  • python中处理字符编码问题

    NO 1认识字符编码 GBK win默认中文字符编码是 xff1a GBK Unicode xff08 统一码 万国码 单一码 xff09 是计算机科学领域里的一项业界标准 xff0c 包括字符集 编码方案等 Unicode 是为了解决传统
  • python中if not的用法

    python中空的概念 xff1a 在python中 xff1a None False 0 空列表 空字典 空元祖 都相当于false coding utf 8 x 61 39 39 0 False None 1 x为真 故not x 为假
  • python实现文件上传下载的功能socket编程(基础版)

    环境介绍 xff1a 项目路径 xff1a 服务端执行过程 xff1a 客户端执行过程 xff1a 上传成功截图 xff1a 服务端代码 xff1a import socket file server 61 socket socket fi
  • -bash: java: command not found (Linux)

    原因 xff1a 安装jdk后没有配置环境变量 1 编辑配置文件 xff0c 配置环境变更 vim etc profile 在最下面添加 export JAVA HOME 61 usr local jdk8 export PATH 61 P
  • idea使用本地代码远程调试线上运行代码---windows环境

    场景 xff1a 今天在书上看了一个代码远程调试的方法 xff0c 自己本地验证了一下感觉十分不错 xff01 xff01 windows环境 xff1a 启动测试jar包 xff1a platform multiappcenter bas
  • anaconda:安装cuda和对应版本的cudnn

    复现别人论文的时候经常遇到不同的cuda版本 xff0c 可以使用anaconda创建虚拟环境 xff0c 并在不同的虚拟环境中配置对应的cuda版本 1 安装anaconda及虚拟环境使用 Anaconda多个python版本 xff08
  • Linux Server 种脚本自动执行

    在我们用python编写完脚本后 xff0c 时常需要定时运行我们的脚本 在这里 xff0c 我为大家介绍两种常用定时执行python脚本文件的方式 xff1a 第一种 xff1a crontab job 在Linux系统中可以通过设置cr
  • Tomcat9配置HTTP/2

    1 概述 Tomcat从Tomcat8的一些较新版本就支持HTTP 2了 xff0c Tomcat9直接支持 xff0c 本文首先讲述了相关HTTP 2的特性 xff0c 接着利用一个简单的开源工具mkcert生成证书并利用该证书配置HTT
  • SVN提交代码报错,怎么破?

    目录 SVN提交代码报错1 SVN提交被锁定 xff08 locked xff09 2 SVN提交已存在版本控制信息 xff08 is already under version control xff09 SVN提交代码报错 1 SVN提
  • Hive隐藏分割字符\001替换为可见字符

    Hive默认的分隔符是 001 xff0c 属于不可见字符 xff0c 这个字符在vi里是 A 一个文本0000 0 xff0c 直接cat内容如下 xff1a 320643204N2559613979 320828796N446323 3
  • 计算机毕业设计 HTML+CSS+JavaScript食品餐饮行业网站(10页)

    x1f380 精彩专栏推荐 x1f447 x1f3fb x1f447 x1f3fb x1f447 x1f3fb 作者简介 一个热爱把逻辑思维转变为代码的技术博主 x1f482 作者主页 主页 x1f680 获取更多优质源码 x1f393 w
  • 基于Redis实现的布隆过滤器

    一 RedisTemplate 1 首先将guava实现的本地的布隆过滤器的算法代码拿过来 span class token comment 算法过程 xff1a 1 首先需要k个hash函数 xff0c 每个函数可以把key散列成为1个整
  • Canal和Kafka整合方案——解决Canal写入Kafka并发消费问题

    文章目录 一 问题描述二 引入Kafka1 Canal整合Kafka及项目初步搭建2 整合Kafka后引出新问题 三 最终方案1 修改Canal配置文件2 修改项目代码3 整体架构4 结果验证 四 总结思考五 参考 一 问题描述 在使用Ca
  • 解决项目版本冲突——maven-shade插件使用

    文章目录 背景maven shade plugin介绍解决问题1 环境准备2 解决方案3 引入依赖 一些需要注意的坑maven shade plugins的其他使用 背景 当我们在maven项目中引入第三方组件时 xff0c 三方组件中的依