解决Elasticsearch和Phoenix、HBase的com.google.guava冲突

it2022-05-05  106

冲突原因

Elasticsearch 2.4.1 依赖com.google.guava18.0以上版本

Phoenix 和 HBase  依赖com.google.guava16.0以下版本

guava 17.0 为临界版本,做了较大改动,导致版本不兼容

常见报错

com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator

解决方案

ES官方方案

https://www.elastic.co/blog/to-shade-or-not-to-shade

方案原理

利用maven-shade-plugin,它可以把依赖的包打包进项目的jar,并且可以重新命名依赖包的包名。这样编译后,Elasticsearch使用的是重新命名的guava18.0包,不再依赖项目中引用的guava16.0版本。

具体实现

用Maven新建工程,只修改pom.xml文件

<?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.test.shade.elasticsearch</groupId> <artifactId>testshadeelasticsearch</artifactId> <version>1.0-SNAPSHOT</version> <name>testshadeelasticsearch</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <elasticsearch.version>2.4.1</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>com.google.guava</pattern> <shadedPattern>com.test.shade.elasticsearch.guava</shadedPattern> </relocation> <relocation> <pattern>org.joda</pattern> <shadedPattern>com.test.shade.elasticsearch.joda</shadedPattern> </relocation> <relocation> <pattern>com.google.common</pattern> <shadedPattern>com.test.shade.elasticsearch.common</shadedPattern> </relocation> <relocation> <pattern>com.google.thirdparty</pattern> <shadedPattern>com.test.shade.elasticsearch.thirdparty</shadedPattern> </relocation> </relocations> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" /> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> <distributionManagement> <repository> <id>nexus-releases</id> <name>ng Release Repository</name> <url>http://maven.cning.com/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>ng Snapshot Repository</name> <url>http://maven.cning.com/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> </project>

打包上传maven仓库

mvn clean package

mvn clean install

mvn clean deploy

项目引用

<!--  使用低版本的guava --> <dependency>   <groupId>com.google.guava</groupId>   <artifactId>guava</artifactId>   <version>16.0</version> </dependency>

<!-- 引入重新命名包名的elasticsearch --> <dependency>     <groupId>com.test.shade.elasticsearch</groupId>    <artifactId>testshadeelasticsearch</artifactId>    <version>1.0-SNAPSHOT</version>     <exclusions>         <exclusion>             <groupId>org.elasticsearch</groupId>             <artifactId>elasticsearch</artifactId>         </exclusion>     </exclusions> </dependency>

<!-- 后面引用Phoenix、HBase包 -->

 


最新回复(0)