目录
1.背景
在项目中引入apollo的时候报错提示
java.lang.NoSuchMethodError: com.google.common.base.Splitter.splitToList(Ljava/lang/CharSequence;)Ljava/util/List;
at com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer.initialize(ApolloApplicationContextInitializer.java:100)
at com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer.initialize(ApolloApplicationContextInitializer.java:82)
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:635)
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:349)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
2.查找原因
根据上述提升,我们可以知道是告诉我们没有com.google.common.base.Splitter.splitToList这个方法,
1.查看使用类
那我们根据提示进入使用这个方法ApolloApplicationContextInitializer的地方去看看一下。
搜索一下发现下面这里用到了
protected void initialize(ConfigurableEnvironment environment) {
if (!environment.getPropertySources().contains("ApolloBootstrapPropertySources")) {
String namespaces = environment.getProperty("apollo.bootstrap.namespaces", "application");
logger.debug("Apollo bootstrap namespaces: {}", namespaces);
List<String> namespaceList = NAMESPACE_SPLITTER.splitToList(namespaces);
CompositePropertySource composite = new CompositePropertySource("ApolloBootstrapPropertySources");
Iterator i$ = namespaceList.iterator();
while(i$.hasNext()) {
String namespace = (String)i$.next();
Config config = ConfigService.getConfig(namespace);
composite.addPropertySource(this.configPropertySourceFactory.getConfigPropertySource(namespace, config));
}
environment.getPropertySources().addFirst(composite);
}
}
2.查看pom文件
我们可以根据提示知道splitToList是com.google.common.base.Splitter类里面的方法,我们点击splitToList发现进不去这个方法,那说明这个类里面没有了这个方法,我们再次搜索这个类com.google.common.base.Splitter,查看这个类里面的方法,发现确实没有splitToList这个方法。
猜测可能是jar包冲突,我们打开pom文件
可以看到确实是jar包冲突了,我们要使用的是19.0版本的,但是使用的是11.0.2版本的jar包,然后11.0.2版本的jar包没有splitToList这个方法,导致问题的出现。
3.解决
1.exclusion
使用exclusion解除掉有冲突的jar包依赖,exclusion表示排除掉jar包下使用某jar包的依赖,
因为这里冲突的jar包很多,所以这里没使用这种方法
下面是写的一个demo
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.7</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2.dependency
maven有个就近原则,所以我们在pom文件里面引入jar包就行了
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
或使用dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
</dependencies>
</dependencyManagement>
刷新maven
发现jar包版本已更新,问题解决