通过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,但后来到各个机器上运行的时候依然报错,索性放那没解决。如果大家有什么好的方法,欢迎指教
Spark集群下运行程序出现java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()Ljava/util/Set异常的解决思路
今天做项目,用到了el表达式和jstl,在tomcat6.0上跑得好好的,没想到copy到tomcat5.5后,服务器起不来了,是tomcat版本的问题。查阅了不少资料,现在总结如下:
错误信息:
java
.
lang
.NoClassDefFoundError:
java
x/el/ExpressionFactory
分析:少包,上网查阅后发现
解决
方法
解决
方法:将
java
ee.jar包再copy一份放在tomcat目录的
common
\lib下
如上完成后即
解决
了该
异常
,大以为大功告成,没想到又出现了新
异常
错误信息:
java
.
lang
.
NoSuchMethodError
:
java
x.
<groupId>
com
.
google
.guava</groupId>
<artifactId>guava</artifactId>
<version>24.0-jre</version>
</dependency>
错误分析:
单独项目没有依赖,开发环境运行正常,tomcat部署war包后,运行找不到方法,Linux系统部署没问题,Windows系统部署出现问题,分析,系统的加载顺序不一致,再开发环境寻找
异常
时,将我们找不到的这个方法的pom依赖找到,尝试将位置放在首位或者最后,再次运行,查看开发环境是否有找不到这个方法的
异常
处理
异常
:
首先将
com
.
google
.
common
.
collect
这个方法,直接在开发环境中写一下查看一下这个包的所在,以下是我修改正常的包路径,问题出现的包路径是
com
.
google
.g
然而注入docker-
java
依赖之后启动项目时报以下错误,以至于项目启动不起来。
java
.
lang
.
NoSuchMethodError
:
com
.
google
.
common
.
collect
.
Sets
$SetView.iterator()L
com
/
google
/
common
/
collect
/UnmodifiableIterator;
at org.reflections.Reflections.expandSuperType
17:45:59.203 [background-preinit] DEBUG org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver - Cannot find
java
x.persistence.Persistence on classpath. Assuming non JPA 2 environment. All properties will per default be traversable.
***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
springfox.documentation.spr
【软件测试】Exception in thread "main"
java
.
lang
.
NoSuchMethodError
:
com
.
google
.
common
.
collect
.ImmutableSet
异常
Exception:
java
.
lang
.
NoSuchMethodError
:
com
.
google
.
common
.
collect
.ImmutableSet.toImmutableSet()L
java
/util/stream/
Collect
or;
at org.openqa.selenium.remote.ProtocolHandshake.streamW3CProtocolParame
SpringbootUnable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFact
12719
java.lang.NoSuchMethodError: com.google.common.collect.Sets.newConcurrentHashSet()异常解决思路
hero_yin: