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

原创
2023/06/28 11:34
阅读数 113

场景

项目里面需要用到华为云的mpc sdk,所以就加入了该sdk的依赖,运行的时候报ClassNotFound异常,经过查看源码后发现是缺失了JsonReadFeature这个类; 然后经过排查,发现当前项目中的jackson版本为2.9.8,mpc sdk依赖的jackson版本为2.14.2,JsonReadFeature类存在于2.14.2版本中,低版本的2.9.8中没有;总结下,很典型的因同一个依赖版本不同导致冲突的场景。

解决方案

使用maven-shade-plugin重新打包mpc sdk

解决步骤

1.新建一个项目,名称为shade-mpc-sdk

2.增加配置如下(部分敏感信息,已做脱敏处理),重点看依赖项及maven-shade-plugin的配置

<?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.xxx</groupId>
    <artifactId>shade-huaweicloud-sdk-mpc</artifactId>
    <version>3.1.45</version>

    <properties>
        <huaweicloud-sdk-mpc.version>3.1.45</huaweicloud-sdk-mpc.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.huaweicloud.sdk</groupId>
            <artifactId>huaweicloud-sdk-mpc</artifactId>
            <version>${huaweicloud-sdk-mpc.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <!--
                                    在使用maven-shade-plugin时,排除META-INF/*.SF、META-INF/*.DSA和META-INF/*.RSA文件
                                    是为了避免在构建过程中出现安全问题。这些文件是Java的签名文件,它们包含了用于验证jar包完整性和来源的数字签名信息。
                                    当多个jar包被合并成一个jar包时,这些签名文件可能会发生冲突/重复,导致校验不通过。
                                    -->
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <relocations>
                                <relocation>
                                    <pattern>com.fasterxml.jackson</pattern>
                                    <shadedPattern>shade.fasterxml.jackson</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

3.重新package、install

4.在原项目中将mpc sdk的依赖坐标改为刚install的jar的坐标

解决原理

根据我的插件配置,maven-shade-plugin会将com.fasterxml.jackson重命名为shade.fasterxml.jackson,并把该路径下的所有的类打进当前jar中;同时也会修改当前项目中及其它依赖的jar中的import路径

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部