문제 배경
데이터 플랫폼에서 프로젝트 구성을 위해서는 ES 및 HBASE를 사용하여 데이터 쿼리 인터페이스를 구축해야합니다. 통합 프로세스 중에 JAR 패키지 충돌이 발생합니다 : com.google.common.base.stopwatch. () V class org.apache.hadoop.hadoop.zookeeper.metatablelocator에서 v.
org.apache.hadoop.hbase.donotretryioexception : java.lang.ilegalaccesserror : 메소드에 액세스하려고 시도했습니다. com.google.common.base.stopwatch. org.apache.hadoop.hbase.client.rpcretryingcaller.translateException (rpcretryingcaller.java:239) at org.apache.hadoop.hbase.client.rpcretretyingcaller.callwithretries (rpcretryingcaler.java:150) ... Java.lang.thread.run (Thread.java:745) : java.lang.ilegalaccesserror : 메소드에 액세스하려고 시도했습니다. com.google.common.base.stopwatch. org.apache.hadoop.hbase.zookeeper.metatablelocator.blockuntil ... at org.apache.hadoop.hbase.client.gregionservercallable.prepare (regionservercallable.java:75) at org.apache.hadoop.hbase.client.rpcretryingcaller.callwithRetries (rpcretryingcaller.java:134) ... 45 more
해결책
조사 후 Com.google.guava 패키지로 인한 갈등이라는 것이 확인되었습니다. ES는 버전 18 이상에 의존하지만 HBase는 버전 16 이상을 지원합니다. Guava 패키지는 17에서 내부적으로 변경되고 메소드가 변경되므로 18은 버전 16과 뒤로 호환되지 않습니다. 프로젝트 작업 중에 16 및 18 버전이 동시에 도입되면 ES 및 HBase의 호출 프로세스가 혼동됩니다. 그러면 다음에 쉽게 할 수 있습니다. 우리는 다시 포장하고 Guava18을 ES로 입력 한 다음 POM 파일에서 GuaVa16 버전을 참조하는 패키지를 표시 할 수 있습니다. 이런 식으로 ES는 패키지 내부에 입력 된 Guava18을 호출하고 HBase는 외부에 입력 된 Guava16을 호출합니다.
재 포장
새 Maven 프로젝트를 작성하고 다음과 같이 POM 파일에서 구성하십시오.
<? 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.xsd"> <modeversion> 4.0.0 </modelversion> <!-이 maven 프로젝트는 Hbase & Ernactics에서 JAR Comfric을 수정하려는 목표입니다. ES에서는 Guava 18+ 이상이 필요했습니다. 그러나 HBase에서는 Guava 16 또는 Blow를 사용해야합니다. CD 프로젝트 디렉토리를 작성하고 실행 'sh ./cleanbuild.sh', 당신은 새 스펠 항아리를 얻을 것입니다. 그런 다음 프로젝트 pom.xml whatth : <pectionency> <groupid> douguo.shaded.elasticsearch </groupId> <artifactid> douguo_shaded_elasticsearch </artifactid> <버전> 1.0-snapshot </version> <pexcusion> <groupid> org.elasticsearch </groupdicestics> <artifactid> elasticsearch </artifactid> </exclusion> </decc @Date : 2017-11-30 @Author : Zhangjianfei @since : douguo.shaded.elasticsearch-1.0.0-> <groupid> douguo.shaded.elasticsearch </groupIds> <artifactid> douguo_shaded_elasticsearch </artifactid> 1.0-snapshot </version </version </version </version </version </version <0-snap < <Elasticsearch.version> 2.4.1 </elasticsearch.version> </properties> <pectients> <pectionement> <groupId> org.elasticsearch </groupid> <artifactid> elasticsearch </artifactid> <버전> $ {elasticsearch.version} </version </version </couregry> <org. <artifactid> Shield </artifactid> <버전> $ {elasticsearch.version} </version} </version} </version> </dependencies> <build> <grugins> <groupid> org.apache.maven.plugins </groupid> <artifactid> maven-shade-pppugin> 2.1 </version> 2.1 <버전>. <createctendencyReducedPom> false </conedenceencyReducedPom> </configuration> <execution> <case> package </phase> <gace> <goving> goal> grade </goal> </goveration> <repiguration> <relocations> <relocation> <pattern> com.google.guava </pattern> </shadeedpattern> douguo.shaded.elastic.elastic.elastic.elastic.elastic.elastic.elastic.eLastic.ELSTICS.ELLASTIC. </퇴학> <clocation> <pattern> org.joda </pattern> <shadedpattern> douguo.shaded.elasticsearch.joda </shadeedpattern> </relocation> <pattern> com.google.common </pattern> <shadeedpattern> douguo.shaded.common </shadeated> <pattern> com.google.thirdparty </pattern> <shadedpattern> douguo.shaded.elasticsearch.thirdparty </shadeedpattern> </repocation> </repocations> <변압기 구현 = "org.apache.maven.plugins.shade.resource.resource.manifestresourceTransformer"//> confestransformers>. </execution> </executions> </executions> </build> <repositories> <repository> <id> elasticsearch-releases </id> http://maven.elasticsearch.org/releases </url> <remeleases> <allabent> <snatpolicy> </updatepolicy> <enabled> false </enabled> </snapshots> </repository> </repository> </repositories> </project> Maven-Shade-Plugin 플러그인 및 재 유형 JAR 패키지를 통해 Org.joda 및 기타 4 개의 가능한 4 개의 가능한 4 가지 항아리 패키지를 마이그레이션 하여이 JAR 패키지를 소개 할 때 외부 종속성을 사용하는 대신 JAR 패키지의 종속성을 사용할 수 있습니다. 여기서는 모든 com.google.common 및 기타 4 개의 패키지를 제거해야한다는 점에 유의해야합니다. 그렇지 않으면 java.lang.ilegalaccesserror : 메소드 com.google.common.base 오류에 액세스하려고 시도했습니다.
프로젝트 패키지
MVN 청소 설치
새로운 종속성 패키지는 .m2 Maven 창고에 있습니다. 회사가 창고를 건설하는 경우 JAR 패키지를 업로드해야합니다. JAR 패키지를 직접 실행하는 경우 프로젝트를 다시 컴파일하고 LIB 디렉토리를 교체하십시오.
프로젝트는 새 패키지를로드합니다
POM 파일로 구성하십시오.
<!-douguo.shaded.elasticsearch-> <pectionency> <groupid> douguo.shaded.elasticsearch </groupid> <artifactid> douguo_shaded_elasticsearch </artifactid> <bersion> 1.0-snapshot </version> <pexclusion> <groupid> org.elasticsearch </groupid> <artifactid> elasticsearch </artifactid> </exclusion> </exceptions> </fectionency> <!-https://mvnrepository.com/artifact/com.google.guava/guava-> <!-이 Guava는 18.0+만으로도 16.0 또는 HBase 만 지원됩니다. douguo.shaded.elasticsearch-> <pectionency> <groupid> com.google.guava </groupid> <artifactid> guava </artifactid> <version> 16.0 </version> </dependency>로 청소하십시오
이러한 방식으로 Guava18 패키지는 Douguo.shaded.elasticsearch에 있으며 ES는 먼저 호출됩니다. 외부 구성 Guava16은 HBase에서 호출됩니다. 2 버전의 JAR 패키지는 서로 독립적으로 존재합니다!
이 시점에서 문제가 해결됩니다!
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.