集群环境Jar包冲突解决方案

开发环境:Maven 3.6 || jdk 1.8(解决方案亲测有效)

问题描述

集成环境中(比如大数据的 CDH,Oozie)有配套的第三方 Jar 包,在自己编写的工具中使用了相同的包,但是版本不同,就会在运行是报错,包的版本产生冲突

java.lang.NoSuchFieldError: INSTANCE

解决办法

使用 maven-shade-plugin 对需要的第三方包重命名并重新打包,映射成自己定义的名字

解决步骤

在 pom.xml 文件中添加 shade 插件

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>org.elasticsearch</pattern>
<shadedPattern>my.elasticsearch</shadedPattern>
</relocation>

<relocation>
<pattern>org.apache.http</pattern>
<shadedPattern>my.apache.http</shadedPattern>
</relocation>

<relocation>
<pattern>com.fasterxml.jackson</pattern>
<shadedPattern>my.fasterxml.jackson</shadedPattern>
</relocation>
</relocations>

<!-- 配置主类 -->
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.xxx.app.EsApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

<!-- 配置编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

主要配置:

<relocations>
<relocation>
<pattern>org.elasticsearch</pattern>
<shadedPattern>my.elasticsearch</shadedPattern>
</relocation>

<relocation>
<pattern>org.apache.http</pattern>
<shadedPattern>my.apache.http</shadedPattern>
</relocation>

<relocation>
<pattern>com.fasterxml.jackson</pattern>
<shadedPattern>my.fasterxml.jackson</shadedPattern>
</relocation>
</relocations>

将官方包的名称及路径修改成为自定义的名称,防止冲突

重新编译打包

推荐使用 luyten 这个工具打开编译打包好的 jar 包,在使用到对应类的 class 文件中就可以看到,原来的 org.elasticsearch 都被替换成 my.elasticsearch 了,其他同理,也就不会出现在集群环境重产生 jar 包冲突的错误了

文章作者: Chentyit
文章链接: http://www.chentyit.cn/2019/12/20/%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83Jar%E5%8C%85%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo