問題の背景
データプラットフォームでは、プロジェクトの構築では、データとHBaseの使用を使用してデータクエリインターフェイスを構築する必要があります。統合プロセス中に、JARパッケージの競合が発生します:com.google.common.base.stopwatch。()v from Class org.apache.hadoop.hbase.zookeeper.metatableleLocator
org.longalaccesserror:java.lang.illegalaccesserror:java.lang.ilegalaccesserror:class org.apach.hadoop.hbase.zookeeper.metataTapatorのメソッドcom.google.common.base.stopwatch。<init>()vにアクセスしようとしました。 org.apache.hadoop.hbase.rpcretrytingcaller.translateException(rpcretrytingCaller.java:239)at org.apache.hadoop.hbase.client.rpcretryingcaller.callwithretries(rpcretryingCaller.java:150)... java.lang.thread.run(thread.java:745)原因:java.lang.illegalaccesserror:メソッドcom.google.common.base.stopwatch。 org.apache.hadoop.hbase.zookeeper.metatableLocator.blockuntil ... at org.apache.hadoop.hbase.client.regionservercallable.prepare(regionservercallable.java:75)at org.apache.hadoop.hbase.client.rpcretryingcaller.callwithretries(rpcretrytingCaller.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 <http://www.w3.org/2001 xsi:schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.0.sdsd"> <modelversion> 4.0.0 </modelversion> <! ESでは、グアバ18歳以上が必要です。ただし、HBaseでは、Guava 16またはBlowを使用する必要があります。 CDプロジェクトディレクトリと実行 'SH ./CLEANBUILD.SH'、あなたは新しいJARを取得します。次に、プロジェクトpom.xml whatth:<dependency> groupid> douguo.shaded.elasticsearch </groupid> <artifactid> douguo_shaded_elasticsearch </artifactid> <バージョン> 1.0-snapshot </version> <exclusions> <artifactid> elasticsearch </artifactid> </exclusion> </explusions> </dependency>最後に、Jar Comflicが修正されます。 @date:2017-11-30 @author:zhangjianfei @since:douguo.shaded.elasticsearch-1.0.0-> <groupid> douguo.shaded.elasticsearch </groupid> <artifactid> douguo_shaded_elasticsearch </artifactid> <バージョン> 1.0-snapshot <ElasticSearch.version> 2.4.1 </elasticsearch.version> </properties> <dependencies> <dependency> groupid> org.elasticsearch </groupid> <artifactid> elasticsearch </artifactid> <バージョン> $ {elasticsearch.version} </version <artifactid> shield </artifactid> <version> $ {elasticsearch.version} </version> </dependency> </dependencies> <bultins> org.apache.maven.maven.maven.maven.plugins <CreatedEndentencyReducedPom> false </recutedEndepenceReducedPom> </configuration> <実行> <フェーズ>パッケージ</phase> <goal> shade </goal> </goal> <configuration> <relocations> <relocation> <pattern> com.google.guava </pattern> <shadedpattern </relocation> <relocation> <pattern> org.joda </pattern> <shadedpattern> douguo.shaded.elasticsearch.joda </shadedpattern> </relocation> <再配置> <再配置> <パターン<relocation> <pattern> com.google.thirdparty </pattern> <shadedpattern> douguo.shaded.elasticsearch.thirdparty.thirdparty </shadedpattern> </relocation> </relocations> <transformers> <トランスフォーマー実装= " </configuration> </execution> </execions> </plugin> </build> <repositories> <repository> <id> elasticsearch-releases </id> <url> http://maven.elasticsearch.org/releases </url> <preseadablead> <Enablead> <praitepolicy> <SnapShots> <Enabled> false </enabled> </snapshots> </repository> </repository> </repositories> </project> Maven-Shade-Pluginプラグインと再タイプのJARパッケージを介してOrg.jodaおよびその他の4つの競合するJARパッケージを移行して、このJARパッケージを導入するときに、外部依存関係を使用する代わりにJARパッケージ独自の依存関係を使用できます。ここでは、すべてのcom.google.commonおよびその他の4つのパッケージを再送信する必要があることに注意する必要があります。それ以外の場合は、java.lang.illegalaccesserror:メソッドcom.google.common.baseエラーにアクセスしようとしました。
プロジェクトパッケージ
MVNクリーンインストール
新しい依存関係パッケージは、.M2 Maven Warehouseにあります。会社が倉庫を建設する場合、JARパッケージをアップロードする必要があります。 JARパッケージを直接実行する場合は、プロジェクトを再コンパイルし、LIBディレクトリを交換することを忘れないでください
プロジェクトは新しいパッケージをロードします
POMファイルで構成するだけです。
<! - douguo.shaded.elasticsearch-> <依存関係> <groupid> douguo.shaded.elasticsearch </groupid> <artifactid> douguo_shaded_elasticsearch </artifactid> <バージョン> 1.0-snapshot </version> <exporusion> <exprius> groupid> arg.elasticear <artifactid> elasticsearch </artifactid> </exclusion> </explusions> </dependency> <! - https://mvnrepository.com/artifact/com.google.guava/guava-> <! - このグアバは、habseでのみ使用されるのは18.0+のみです。 douguo.shaded.elasticsearch-> <dependency> <groupid> com.google.guava </groupid> <artifactid> guava </artifactid> <バージョン> 16.0 </version> </dependency>
このようにして、Guava18パッケージはDouguo.shaded.elasticsearchの下にあり、ESは最初に呼び出されます。外部で構成されたGUAVA16は、HBaseによって呼び出されます。 JARパッケージの2つのバージョンは、互いに独立して存在します!
この時点で、問題は解決されます!
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。