Java.lang.NoClassDefFoundError: com/google/common/util/concurrent/FutureFallback 这是一个Java错误消息,意味着系统无法找到所需的类(FutureFallback)。它通常是由于缺少必要的库或未正确配置类路径引起的。

21

我看到了以下错误:

java.lang.NoClassDefFoundError: com/google/common/util/concurrent/FutureFallback

当调用cluster.connect()时:

            String hosts = CassandraClientUtil.getHost();
            String localDC = CassandraClientUtil.getLocalDC();
            Cluster cluster = null;
            if (StringUtils.isNotEmpty(localDC))
            {
                cluster = Cluster.builder().addContactPoints(hosts.split(","))
                        .withCredentials(CassandraCopsComponentLogger.USER_NAME, CassandraCopsComponentLogger.AUTH_CODE)
                        .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_ONE))
                        .withLoadBalancingPolicy(new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().withLocalDc(localDC).build())).build();
            }
            else
            {
                cluster = Cluster.builder().addContactPoints(hosts.split(","))
                        .withCredentials(CassandraCopsComponentLogger.USER_NAME, CassandraCopsComponentLogger.AUTH_CODE)
                        .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_ONE)).build();
            }

            Session session = cluster.connect();
            CassandraCopsComponentLogger.mappingManager = new MappingManager(session);

pom.xml文件具有以下依赖关系:

<dependencies>
        <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>16.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-core</artifactId>
            <version>2.1.9</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty</artifactId>
            <version>3.9.0.Final</version>
        </dependency>
        <dependency>
            <groupId>com.codahale.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>3.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>   
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-mapping</artifactId>
            <version>2.1.9</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>
  </dependencies>

我在stackoverflow看到了一篇帖子(链接),其中建议将guava版本升级到16.0.1,但这并没有帮助我解决问题。由于我刚接触cassandra,所以我需要更多的指导。补充一下背景信息,这个项目可以作为一个独立项目运行,但当我将其作为maven依赖项添加到其他项目中时,就会出现此运行时错误。


1
Guava 14引入了FutureFallback,因此我怀疑您指定的版本(16.0.1)未被考虑在内,而是使用了一些非常旧的版本;您能否运行“mvn dependency:resolve”并检查正在解析用于构建的Guava的实际版本? - adutra
1
@adutra 在Guava 19中已被弃用,然后在Guava 20中被删除:https://google.github.io/guava/releases/19.0/api/docs/com/google/common/util/concurrent/FutureFallback.html - Hendy Irawan
1
没错,我们已经意识到这个问题并正在努力替换它:https://datastax-oss.atlassian.net/browse/JAVA-1328。目前,该驱动程序无法与Guava 20一起使用。 - adutra
4个回答

24

在日志中:INFO GuavaCompatibility.java:135 [{}] 检测到类路径中的 Guava < 19,使用旧的兼容层,明确指出您可以通过添加版本 < 19 的 Guava 来使其正常工作。Cassandra 驱动程序使用较旧的 Guava。可能是您从父 POM 继承了更新的 Guava。 - Apurva Singh

6
我已将Cassandra驱动程序版本升级到最新可用版本,这应该解决了问题。
<dependency>
   <groupId>com.datastax.cassandra</groupId>
   <artifactId>cassandra-driver-core</artifactId>
   <version>3.5.0</version>
</dependency>

1
如何修复。此版本的Cassandra驱动程序使用Guava 19。 - Heisenberg

2
不要添加外部的guava版本。无论datastax-cassandra-core使用哪个版本,您只需要放置那个版本即可。否则不需要。

-1
如果有像我一样不知道的人,现在有一个新版本(4.x),带有新的和不同的组ID,请查看quickstart。这个新版本仍然使用Guava,但已经被遮蔽了。

驱动程序现在需要Java 8。它不再依赖于Guava(我们仍然在内部使用它,但是已经被遮蔽了)。

更多信息可在升级指南中找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接