Cassandra 驱动程序 3.4 与 Guava 30 不兼容

Cassandra driver 3.4 is not compatible with Guava 30

我们有一个从 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>

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

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

关于你的问题,

Is it possible to make them both live together in the same Java process?

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