冲突原因
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包 -->
