通过maven-shade-plugin 解决Elasticsearch与hbase的jar包冲突问题
2016-06-13 20:08
936 查看
今天在项目中集成hbase1.0.0-cdh5.5.2和ElasticSearch2.2.0时出现了问题,原先在集成hbase时,引入了架包com.google.guava(16.0版本),后来在集成ES时发现es中也用到了guava的18.0版本。这时候问题来了,如果将原来的guava 16.0版本修改为18.0版本,hbase就是因为版本太高而报错。如果继续使用16.0版本es的javaAPI就会因为guava的版本太低而报错。好尴尬
。。。。
于是乎查询了一下资料,发现在ES的官网上有一篇关于jar包冲突的blog。所以参考修改了一下,折腾一天终于搞定。下面回顾一下整个过程:
1.首先是参考es官网blog:https://www.elastic.co/blog/to-shade-or-not-to-shade ,新建一个maven项目进行如下配置
如上配置完成后,其实就是将org.joda等4个可能有冲突的jar包通过maven-shade-plugin插件迁移后重新打个jar包从而使得在引入这个jar包时能够使用该jar包自己的依赖而不是使用外部依赖。
这里笨小葱一开始犯了个严重的错误,我一直以为只有guava这一个包冲突了,所以一开始并没有做com.google.common的jar包迁移。所以在使用hbase时出现了如下错误:
java.lang.IllegalAccessError: tried to access method com.google.common.base........
后来引入com.google.common后才解决问题。
pom文件配置完成后运行:
然后看到build success的话表示打包成功,新的依赖包会在.m2文件的仓库中。
下面回到原来的集成项目的pom文件中。引入该jar包: (注意这里需要排除掉es2.2.0的jar包,不然maven会将2.2.0的jar包打进去,造成冲突)
好啦,到这里测试一下会发现,冲突问题解决啦。
补充:如果需要定位到具体是哪个class引起的冲突,可以通过在tomcat的bin/catalina.sh中配置:
JAVA_OPTS="-verbose:class" tomcat启动后会在catalina.out日志文件中打印出加载的类的位置。从而定位出哪个class加载了不正确的jar包.
。。。。
于是乎查询了一下资料,发现在ES的官网上有一篇关于jar包冲突的blog。所以参考修改了一下,折腾一天终于搞定。下面回顾一下整个过程:
1.首先是参考es官网blog:https://www.elastic.co/blog/to-shade-or-not-to-shade ,新建一个maven项目进行如下配置
<?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>my.elasticsearch</groupId> <artifactId>es-shaded</artifactId> <version>1.0-SNAPSHOT</version> <properties> <elasticsearch.version>2.2.0</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>shield</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>my.elasticsearch.guava</shadedPattern> </relocation> <relocation> <pattern>org.joda</pattern> <shadedPattern>my.elasticsearch.joda</shadedPattern> </relocation> <relocation> <pattern>com.google.common</pattern> <shadedPattern>my.elasticsearch.common</shadedPattern> </relocation> <relocation> <pattern>com.google.thirdparty</pattern> <shadedPattern>my.elasticsearch.thirdparty</shadedPattern> </relocation> </relocations> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" /> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> <repositories> <repository> <id>elasticsearch-releases</id> <url>http://maven.elasticsearch.org/releases</url> <releases> <enabled>true</enabled> <updatePolicy>daily</updatePolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
如上配置完成后,其实就是将org.joda等4个可能有冲突的jar包通过maven-shade-plugin插件迁移后重新打个jar包从而使得在引入这个jar包时能够使用该jar包自己的依赖而不是使用外部依赖。
这里笨小葱一开始犯了个严重的错误,我一直以为只有guava这一个包冲突了,所以一开始并没有做com.google.common的jar包迁移。所以在使用hbase时出现了如下错误:
java.lang.IllegalAccessError: tried to access method com.google.common.base........
后来引入com.google.common后才解决问题。
pom文件配置完成后运行:
mvn clean install
然后看到build success的话表示打包成功,新的依赖包会在.m2文件的仓库中。
下面回到原来的集成项目的pom文件中。引入该jar包: (注意这里需要排除掉es2.2.0的jar包,不然maven会将2.2.0的jar包打进去,造成冲突)
<dependency> <groupId>my.elasticsearch</groupId> <artifactId>es-shaded</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions> </dependency>
好啦,到这里测试一下会发现,冲突问题解决啦。
补充:如果需要定位到具体是哪个class引起的冲突,可以通过在tomcat的bin/catalina.sh中配置:
JAVA_OPTS="-verbose:class" tomcat启动后会在catalina.out日志文件中打印出加载的类的位置。从而定位出哪个class加载了不正确的jar包.
相关文章推荐
- 巧用mysql提示符prompt清晰管理数据库的方法
- 两大步骤教您开启MySQL 数据库远程登陆帐号的方法
- phpmyadmin 4+ 访问慢的解决方法
- linux系统下实现mysql热备份详细步骤(mysql主从复制)
- CentOS 5.5下安装MySQL 5.5全过程分享
- MySQL复制的概述、安装、故障、技巧、工具(火丁分享)
- MySQL中删除重复数据的简单方法
- 使用ElasticSearch6.0快速实现全文搜索功能的示例代码
- elasticsearch批量数据导入和导出
- 使用ElasticSearch+LogStash+Kibana+Redis搭建日志管理服务
- ElasticSearch 使用心得
- ES中如何使用逗号来分词
- ElasticSearch 守护进程 JSW
- elasticsearch2.3安装以及集群部署
- Elasticsearch2.2.0数据操作
- Elasticsearch2.2.0安装ik中文分词
- Elasticsearch2.2.0安装pinyin插件
- Elasticsearch Client(JAVA API) JAVA实例
- ElasticSearch简单介绍
- ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台