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

首先,需要清楚的是,当我们使用Maven构建项目时,会引入许多第三方依赖,有时这些依赖版本存在冲突,会导致我们的项目无法正常编译和运行。这时候就需要使用Maven Shade Plugin来解决依赖版本冲突问题。

以下是Maven Shade Plugin的使用教程:

1. 添加Maven Shade Plugin插件到项目中

在项目中的pom.xml文件中添加以下代码:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
     <version>3.2.4</version>
      <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
      </configuration>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>com.example.Main</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

在这个例子中,我们定义了Maven Shade Plugin在package阶段运行,并且指定了插件要使用的transformers。

2. 配置transformers

Maven Shade Plugin中的transformers可以用来修改打包后的jar包文件,实现依赖版本冲突的解决。

注意:以下示例中的groupId、artifactId、version仅作为示例,实际使用时需要根据项目的实际情况进行修改。

2.1 重复类合并处理Transformer

在项目中,有可能会存在多个依赖包中都存在同名的类,这时候需要使用Maven Shade Plugin的重复类合并处理transformer将这些类合并成一个,从而避免冲突。具体实现步骤如下:

  • 在pom.xml文件中添加以下代码:
<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>
             <transformers>
               <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                 <mainClass>org.example.Main</mainClass>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.DontIncludeTestResourcesTransformer" />
               <transformer implementation="org.apache.maven.plugins.shade.plugins.IncludeResourceTransformer">
                 <resource>log4j.properties</resource>
                 <file>src/main/resources/log4j.properties</file>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.JarTransformer">
                 <mainClass>org.example.Main</mainClass>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.ReproducibleJarTransformer" />
               <transformer implementation="org.apache.maven.plugins.shade.plugins.MinimalMainArtifactFilter">
                <groupId>commons-cli</groupId>
                 <artifactId>commons-cli</artifactId>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.AppendingTransformer">
                 <resource>
                   META-INF/spring.handlers
                 </resource>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.ComponentsXmlAggregatorTransformer">
                 <components>
                   <component>
                     <resource>META-INF/cxf/bus-extensions.xml</resource>
                     <implementation>org.apache.cxf.bus.spring.BusExtensionPostProcessor</implementation>
                   </component>
                 </components>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.ClasspathAppendingTransformer">
                 <resource>log4j.properties</resource>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.RenamingTransformer">
                 <artifactSet>
                   <includes>
                     <include>com.google.guava:guava*</include>
                   </includes>
                   <excludes>
                     <exclude>com.google.guava:*-source</exclude>
                     <exclude>com.google.guava:*-javadoc</exclude>
                   </excludes>
                 </artifactSet>
                 <regex>guava-([0-9.]+).jar</regex>
                 <replacement>guava-$1-repackaged.jar</replacement>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.DontIncludeJarsWithGroupIdArtifactIdTransformer">
                 <groupId>commons-logging</groupId>
                 <artifactId>commons-logging</artifactId>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.ServicesResourceTransformer" />
               <transformer implementation="org.apache.maven.plugins.shade.plugins.XmlAppendingTransformer">
                 <resource>spring.xml</resource>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.IncludeAsResourceTransformer">
                 <resource>META-INF/my-file.txt</resource>
                 <file>${basedir}/target/classes/META-INF/my-file.txt</file>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.ExcludeResourceTransformer">
                 <resource>**/*-linux-x86*</resource>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.JarResourceTransformer">
                 <targetPath>conf</targetPath>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.FilteringTransformer">
                 <resource>**/*.properties</resource>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.CustomManifestTransformer">
                 <mainClass>org.example.Main</mainClass>
                 <manifestEntries>
                   <Owner>my company name</Owner>
                 </manifestEntries>
                 <merges>
                   <merge></merge>
                 </merges>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.VersionResourceTransformer" />
               <transformer implementation="org.apache.maven.plugins.shade.plugins.DependencyReducedPomTransformer" />
               <transformer implementation="org.apache.maven.plugins.shade.plugins.XmlAppendingTransformer">
                 <resource>META-INF/maven/com.google.guava/guava/pom.xml</resource> <!-- source of pom file -->
                 <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                   <!-- xpath expression to match parent node in target -->
                   <xpath>/project/dependencies</xpath>
                   <!-- xpath expression of element to append -->
                   <resource>META-INF/maven/com.google.guava/guava/pom.xml</resource> <!-- source of dependency -->
                 </transformer>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.plugins.ManifestResourceTransformer" />
             </transformers>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>
  • 在运行命令时,使用命令mvn package来将项目打包成jar包。

2.2 指定依赖版本

Maven Shade Plugin中的relocating transformer可以用来修改依赖包的包路径,从而避免依赖版本冲突。具体实现步骤如下:

  • 在pom.xml文件中添加以下代码:
<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>
             <relocations>
               <relocation>
                 <pattern>commons-logging</pattern>
                 <shadedPattern>com.sample.commons.logging</shadedPattern>
               </relocation>
             </relocations>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>
  • 在运行命令时,使用命令mvn package来将项目打包成jar包。

以上就是使用Maven Shade Plugin解决依赖版本冲突的详细攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用maven shade插件解决项目版本冲突详解 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • springboot自动装配大概原理

    自动装配: pom.xml spring-boot-dependence:核心都依赖在父类工程中! 我们在写入或者引入springboot依赖的时候,不需要指定版,因为有这些仓库的版本 启动器:——spring boot的启动场景 比如spring-boot-starter-web,他就会帮我们导入web环境苏需要的依赖。 springboot会将所…

    Java 2023年4月25日
    00
  • 如何解决java压缩文件乱码问题

    针对Java压缩文件乱码问题,这里提供一份解决方案。 第一步:查找乱码原因 首先我们需要确定压缩文件存在乱码的原因。一般情况下,乱码的原因可能是: 压缩文件编码格式不正确(例如使用GBK编码打包的文件在使用UTF-8进行解压时会出现乱码) 解压程序的编码格式不正确 压缩文件本身存在编码问题 第二步:使用正确的编码格式 针对第一种情况,我们可以在压缩文件时指定…

    Java 2023年5月20日
    00
  • Spring MVC 更灵活的控制 json 返回问题(自定义过滤字段)

    Spring MVC 是一款常用的 Web 框架,用于开发 Java Web 应用程序。它允许开发者对应用程序做出灵活的控制,其中一项迫切需要的控制就是对返回 JSON 数据的过滤。本文将探讨如何通过 Spring MVC 实现更灵活的对 JSON 返回数据进行过滤的控制。 环境搭建 在本地安装好 JDK 1.8 和 Maven 3.x 后,在 pom.xm…

    Java 2023年5月19日
    00
  • Java集合中的fail-fast(快速失败)机制详解

    Java集合中的fail-fast(快速失败)机制详解 简介 Java集合中的fail-fast机制,指在对集合进行遍历操作的过程中,若集合的结构被修改了(增、删、改),那么程序便会抛出并发修改异常ConcurrentModificationException,终止遍历操作,从而避免因对已经被修改的集合进行操作而导致数据不一致等问题的产生。 fail-fas…

    Java 2023年5月28日
    00
  • SpringBoot使用RESTful接口详解

    SpringBoot使用RESTful接口详解 什么是RESTful接口 RESTful是一种基于HTTP协议实现的Web服务的架构风格,其常用于构建分布式的网络应用程序和服务。RESTful接口设计的核心是资源的定义和状态的转换,它通过使用HTTP协议规定的方法(GET、POST、PUT、DELETE等),操作网络上的资源。HTTP中的资源可以是任何东西,…

    Java 2023年5月20日
    00
  • Spring单元测试控制Bean注入的方式

    下面我们就详细讲解一下Spring单元测试控制Bean注入的方式的完整攻略吧。 什么是Spring单元测试 Spring单元测试是指在Spring环境下执行单元测试。它可以模拟一个Web容器环境,通过IoC和AOP的支持,创建出被测试类的实例,来执行相应的测试操作。 Spring单元测试控制Bean注入的方式 在Spring单元测试中,我们有三种方式可以控制…

    Java 2023年5月19日
    00
  • 基于Java实现二维码的生成和解析

    基于Java实现二维码的生成和解析 一、背景介绍 二维码是一种矩阵式的条码,是快速响应码(QR Code)的简称,由日本的QR Code发明并推广至全球。近年来,随着智能手机的广泛普及,二维码已经成为了一种快速传递信息的便捷方式,在生活中广泛使用。在Java中,可以使用第三方库生成和解析二维码,其中Zxing是一个常用的库。 二、生成二维码 1. 引入依赖 …

    Java 2023年5月20日
    00
  • Java Http接口加签、验签操作方法

    关于Java Http接口加签、验签操作方法的完整攻略,可以分为以下几个部分: 什么是接口加签、验签? 在网络通信中,为了防止数据伪造、篡改等安全问题,需要使用加密、签名等方式来保护数据安全。接口加签、验签是其中的一种方式。简单来说,就是在数据通信的过程中,在数据中加入签名信息,用于识别数据的真实性。接口加签指的是计算签名,并将签名在请求头或请求参数中传输。…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部