日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

使用maven的Shade方式解决

發布時間:2023/12/15 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 使用maven的Shade方式解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 依賴包沖突

問題描述

程序中同時使用了hadoop工具包與ElasticSearch工具導致jar包。
程序報錯

java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;

內容如下

java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
at org.elasticsearch.threadpool.ThreadPool.(ThreadPool.java:190)

原因分析

通過對上述錯誤進行google可以判斷是由于Elasticsearch引用的guava包版本不正確而導致。程序中hadoop依賴的guava包版本為11版本,而ES所需要的版本為18以上。因此我們首先在maven中將guava的版本強制指定為18版本,但是將程序打包后上傳到linux生成環境程序仍然無法正常運行。

解決方案

根據[官網博客][3]說明,我們將ElasticSearch以及它的相關依賴包以shade的打包成一個獨立的jar包,對應ElasticSearch相關類的使用均從此jar包引用。

1、shade Elasticsearch包

首先創建新的maven工程,pom.xml文件如下:

<groupId>my.elasticsearch</groupId>
    <artifactId>es-shaded</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <elasticsearch.version>2.1.2</elasticsearch.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</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>org.elasticsearch</pattern>
                                    <shadedPattern>my.elasticsearch</shadedPattern>
                                </relocation>
                            </relocations>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在pom.xml中我們指定了該項目依賴org.elasticsearch包,且版本為2.1.2,并強制指定了guava的版本為18(此處若不指定應該也會自行依賴18以上的包,但并未進行測試)。然后在build標簽中可以看出,我們利用maven的shade工具完成打包情況如下:

org.joda映射為my.elasticsearch.jodacom.google.guava映射為my.elasticsearch.guavacom.google.common映射為my.elasticsearch.commonorg.elasticsearch映射為my.elasticsearch

然后利用mvn clean install命令進行打包得到es-shaded-1.0-SNAPSHOT.jar,創建一個屬于你自己版本的Elasticsearch包。之后將該包上傳到私服maven鏡像。

2、在工程中使用自己的Elasticsearch包

完成上數對Elasticsearch的打包之后,在自己工程中的pom.xml中,我們引用此包方式如下:

<dependencies>
       ...
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>${hive.version}</version>
    </dependency>
    <dependency>
      <groupId>org.antlr</groupId>
      <artifactId>ST4</artifactId>
      <version>4.0.8</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>my.elasticsearch</groupId>
      <artifactId>es-shaded</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

在使用上述方式引用了Elasticsearch包之后,在程序中我們可以這樣對Elasticsearch包進行引用
代碼如下:

import my.elasticsearch.ElasticsearchException;
import my.elasticsearch.action.bulk.BulkItemResponse;
import my.elasticsearch.action.bulk.BulkRequestBuilder;
import my.elasticsearch.action.bulk.BulkResponse;
import my.elasticsearch.action.index.IndexRequest;
import my.elasticsearch.client.transport.NoNodeAvailableException;

這樣確保了我們使用的elasticsearch包是我們之前創建的。對Elasticsearch所依賴版本的 joda相關包的引用方式也是類似:

import my.elasticsearch.joda.time.DateTime;

這樣就不會出現Elasticsearch依賴包不正確的情況。

另外情況描述使用JDBC從Hive中抽取數據,所以maven項目中有hive依賴庫;數據導入Elasticsearch,版本2.3.1其中guava庫為18以上的版本hive與ES的guava版本沖突現象:java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;

解決方法

將Elasticsearch中沖突庫,進行改名,重新打包;在新項目中引入新打包的ES庫

方法一:Shade and relocate

簡介

為了避免ES中庫與其他依賴庫的沖突,可以選擇將ES依賴的沖突庫relocate,并映射到新的名詞,避免庫覆蓋。因為hadoop生產環境的更新并不方便,通過maven的shade插件,重新映射庫版本更靠譜

Shade Elasticsearch

這一步將所依賴的ES庫進行shade,創建一個新的maven項目,將依賴的Elasticsearch庫依賴加入,并將沖突的庫relocate,編譯成新的jar

<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.3.1</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>

引入shade ES jar

在新的項目中引入上一步編譯好的ES包

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>${guava.version}</version>
</dependency>
<dependency>
    <groupId>my.elasticsearch</groupId>
    <artifactId>es-shaded</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

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

方法二:修改集群job庫加載策略(未實驗)

<property>
    <name>mapreduce.job.user.classpath.first</name>
    <value>true</value>
</property>

參考文獻

[1]https://www.elastic.co/blog/to-shade-or-not-to-shade
[2]http://www.cnblogs.com/bigbigtree/p/6668542.html
[3]:https://www.elastic.co/blog/to-shade-or-not-to-shade

正因為當初對未來做了太多的憧憬,所以對現在的自己尤其失望。生命中曾經有過的所有燦爛,終究都需要用寂寞來償還。

總結

以上是生活随笔為你收集整理的使用maven的Shade方式解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。