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?
可以使用多个类加载器,但您可能不想这样做。
我们有一个从 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?
可以使用多个类加载器,但您可能不想这样做。