【问题标题】:Cassandra driver 3.4 is not compatible with Guava 30Cassandra 驱动程序 3.4 与 Guava 30 不兼容
【发布时间】:2021-05-09 01:49:41
【问题描述】:

我们有一个从 Cassandra 表读取的 Java 8 独立应用程序,我们当前使用的客户端版本是 3.4.0。该应用程序还应该支持从 Google Cloud Storage 读取,但是一旦我们将 GCS 依赖项添加到 pom 文件中,我们开始在从 Cassandra 读取时看到异常。好像 3.4 驱动使用 Guava 19,而 GCS 使用 Guava 30。是否有可能让它们都生活在同一个 Java 进程中?试图从 cassandra-driver-core 3.4 中排除 Guava 导致以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/util/concurrent/FutureFallback
    at com.datastax.driver.core.GuavaCompatibility.selectImplementation(GuavaCompatibility.java:136)
    at com.datastax.driver.core.GuavaCompatibility.<clinit>(GuavaCompatibility.java:52)
    at com.datastax.driver.core.Cluster.<clinit>(Cluster.java:68)
    at com.myorg.infra.cassandra.CassandraConnector.basicBuilder(CassandraConnector.java:32)
    at com.myorg.infra.cassandra.CassandraConnector.connect(CassandraConnector.java:61)
    at com.myorg.aggregator.cassandra.analytics.repository.CategoryDetailsRepository.main(CategoryDetailsRepository.java:56)
Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.FutureFallback
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Cassandra 依赖项:

<dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-core</artifactId>
            <version>3.4.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-mapping</artifactId>
            <version>3.4.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

GCS 依赖项:

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>libraries-bom</artifactId>
        <version>20.1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

<dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-storage</artifactId>
        </dependency>

【问题讨论】:

    标签: guava cassandra-3.0


    【解决方案1】:

    我遇到了类似的问题,发现将 Cassandra 驱动程序版本升级到 3.11.0 是最好的解决方案。需要Guava 30,同时保留大部分驱动接口。

    请注意,Cassandra 驱动程序版本 4.0+ 不是二进制兼容的,这意味着您不能将其放入并希望它能正常工作。它确实需要完全重写应用程序代码。

    关于你的问题,

    是否有可能让它们同时存在于同一个 Java 进程中?

    可以使用多个类加载器,但您可能不想这样做。

    【讨论】:

      猜你喜欢
      • 2017-06-04
      • 2020-02-01
      • 2023-02-13
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多