使用maven-shade-plugin插件解决phoenix中guava包冲突
·
首先:
项目中使用到了phoenix,引入的依赖如下,此依赖中包含Guava27.0.版本jar依赖。
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.1.3</version>
</dependency>

项目中后期还使用到了clickhouse.引入的依赖如下,此依赖中包含Guava19.0版本jar依赖。
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.2.4</version>
</dependency>

由于:
guava版本在16.0以后,不向后兼容。用Guava19.0版本,则会少了Guava27.0版本中的某些类,反之就会少Guava19.0版本中的某些类。phoenix和clickhouse总有一个会报错
解决:
新建maven项目,在项目中引入Phoenix依赖包(Guava27.0),使用maven-shade-plugin打包,给guava27.0包中的核心类com.google.common映射别名,然后将打包好的jar包加入到maven仓库。在项目中针对查询Phoenix导入我们自己加入的包(内部实际使用guava27.0),针对ClickHouse在项目中正常使用guava19版本即可。
具体如下:
1.Idea创建项目phoenix-core-guava-shaded
2.项目中引入如下依赖
<dependencies>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.1.3</version>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.flink.httpcomponents</groupId>
</exclusion>
<exclusion>
<artifactId>httpcore</artifactId>
<groupId>org.apache.flink.httpcomponents</groupId>
</exclusion>
<exclusion>
<artifactId>commons-httpclient</artifactId>
<groupId>commons-httpclient</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3.在pom.xml中加入maven-shade-plugins并配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>com.selfjarconflict.bigdata.phoenix.common</shadedPattern>
</relocation>
</relocations>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<!-- deploy插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
4.使用maven打包

5.在jar所在目录使用cmd打开命令行,执行如下代码
mvn install:install-file -DgroupId=com.selfjarconflict.bigdata.phoenix -DartifactId=phoenix-core-guava-shaded -Dversion=1.0 -Dfile=D:\find_work\studyNote\bigdata\two\00_project\phoenixcoreguavashaded\target\phoenix-core-guava-shaded-1.0.jar -Dpackaging=jar
其中groupId,aetfactId,version都是一一对应的,file文件指的jar包的绝对路径,
回车,jar包就会到maven设置的仓库地址中去
查看maven仓库中加入的依赖包

6.在正常使用项目中引入该jar包
Phoenix使用到的Guava27.0包引入此依赖即可,但是需要将Phoenix-core包exclusion排除,否则又会引入Guava27.0包导致冲突。针对使用到Guava19.0依赖,直接引入即可,即可解决冲突。引入如下:
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.2.4</version>
</dependency>
<!-- 解决phoenix中guava包冲突自己改写定义的jar包 -->
<dependency>
<groupId>com.selfjarconflict.bigdata.phoenix</groupId>
<artifactId>phoenix-core-guava-shaded</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
</exclusion>
</exclusions>
</dependency>

更多推荐
所有评论(0)