1. 程式人生 > >java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()異常解決思路

java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()異常解決思路

  通過Spark-submit提交的任務丟擲了java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()Ljava/util/Set的異常,去網上搜了一下解決思路,大概有以下幾種方法,供大家參考下:

  一、Guava低版本和高版本的衝突。newConcurrentHashSet這個方法是在Guava-15.0及更高版本中在出現的,如果你的程式中有其它的jar包依賴了低版本的guava,如guava-14.0等,你就需要此jar包找出來,並且把低版本的guava從此jar包中移除出去。

          移除方法:假如是A jar包中依賴了低版本的guava,可以在pom檔案中A jar下加入如下程式碼

               <dependency>
                  <groupId>A</groupId>
                  <artifactId>A</artifactId>
                  <version>1.0</version>
                  <exclusions>
                   <exclusion>
                   <groupId>com.google.guava</groupId>
                   <artifactId>guava</artifactId>
                 </exclusion>
               </exclusions>
             </dependency>

           p.s jar包依賴關係的查詢:

            1、Eclipse下直接開啟pom檔案,選擇Dependency Hierarchy選項進行檢視

             

          2、Linux 下通過命令:mvn dependency:tree 來進行檢視


    二、 guava 版本和 google-collections衝突。 找到依賴google-collections的jar包,把依賴關係去掉。

                移除方法:假如是A jar包中依賴了低版本的google-collections,可以在pom檔案中A jar下加入如下程式碼

               <dependency>
                  <groupId>A</groupId>
                  <artifactId>A</artifactId>
                  <version>1.0</version>
                  <exclusions>
                   <exclusion>
                   <groupId>com.google.collections</groupId>
                   <artifactId>google-collections</artifactId>
                 </exclusion>
               </exclusions>
             </dependency>

    三、 Hadoop叢集或者spark叢集中的jar包的影響:這種情況是最難解決的一種情況,你可以通過此種方法打印出是哪個jar包導致的此錯誤

             在你程式拋異常的那句話上面加上如下程式碼:

               System.out.println("----------------------" + this.getClass().getResource("/com/google/common/collect/Sets.class"));

              執行你的程式碼,會打印出含有Sets這個類的jar包,然後檢查此jar包出現在何處,看是否可以去掉。去掉是最不好的一種方法。


    題外話:我程式中的錯誤就是因為Spark提交任務後老是載入hadoop安裝目錄下的一個avro-tools-1.7.6-cdh5.5.0.jar的一個jar包,這個jar包我又沒法去掉,本來想著在spark-defaults.conf 檔案下加入這句話:spark.driver.extraClassPath=...../guava-17.0.jar,後來發現Spark程式剛啟動的時候確實載入了Guava,但後來到各個機器上執行的時候依然報錯,索性放那沒解決。如果大家有什麼好的方法,歡迎指教