
cassandra unit 当前(v4.3.1.0)基于 cassandra 3.11,仅官方支持 jdk 8;其对 jdk 17 完全不兼容,会导致嵌入式集群启动卡死、无响应或超时失效。
cassandra unit 当前(v4.3.1.0)基于 cassandra 3.11,仅官方支持 jdk 8;其对 jdk 17 完全不兼容,会导致嵌入式集群启动卡死、无响应或超时失效。
Cassandra Unit 是一款广泛用于 Java 单元测试的嵌入式 Cassandra 框架,但其底层依赖决定了它对 JVM 版本高度敏感。截至最新稳定版 cassandra-unit:4.3.1.0,项目仍捆绑 Apache Cassandra 3.11.x(参见 GitHub pom.xml),而 Cassandra 3.11 仅正式支持 JDK 8 —— 在 JDK 11 或更高版本(包括 JDK 17)上运行时,会出现静默挂起(如 EmbeddedCassandra.startEmbeddedCassandra() 长时间阻塞、无异常、无日志、超时不触发),根本原因在于类加载、JMX 初始化及 Netty 线程模型与新版 JDK 的不兼容。
✅ 关键兼容性事实梳理:
- ✅ Cassandra 4.0.0:引入对 JDK 11 的实验性支持(CASSANDRA-9608)
- ✅ Cassandra 4.0.2+:提供完整、稳定 JDK 11 支持(CASSANDRA-16894)
- ⚠️ Cassandra 4.x(含 4.1):尚未支持 JDK 17;相关工作(CASSANDRA-16895)仍在进行中,预计纳入未来 4.2+ 或 5.0 版本
- ❌ Cassandra Unit 4.3.1.0:完全不兼容 JDK 17,强行使用将导致不可恢复的启动失败
? 可行解决方案推荐:
- 降级 JDK(短期调试):在测试模块中临时切换至 JDK 8(推荐 OpenJDK 8u362+),确保 cassandra-unit 正常工作;生产代码仍可用 JDK 17 编译(通过 Maven toolchain 隔离)。
- 迁移至 Testcontainers(强烈推荐):使用 Docker 启动真实 Cassandra 实例,兼容任意 JDK 版本:
<!-- Maven --> <dependency><groupid>org.testcontainers</groupid><artifactid>cassandra</artifactid><version>1.19.8</version><scope>test</scope></dependency>
@Test
void testWithCassandraContainer() {
try (GenericContainer> cassandra = new GenericContainer("cassandra:4.1")
.withExposedPorts(9042)) {
cassandra.start();
String contactPoint = cassandra.getHost() + ":" + cassandra.getMappedPort(9042);
// 使用 java-driver-core 4.15.0 建立连接
CqlSession session = CqlSession.builder()
.addContactPoint(new InetSocketAddress(cassandra.getHost(), cassandra.getMappedPort(9042)))
.withLocalDatacenter("datacenter1")
.build();
// 执行测试逻辑...
session.close();
}
}
- 关注上游进展:订阅 CASSANDRA-16895 及 cassandra-unit GitHub 动态,待其升级至 Cassandra 4.2+ 并声明 JDK 17 支持后,再评估迁移。
? 注意事项:
- 不要尝试通过 -XX:+IgnoreUnrecognizedVMOptions 或 -Dcassandra.ignore_jdk_warnings=true 绕过 JDK 版本检查——Cassandra 3.11 在 JDK 17 下存在底层 API 移除(如 javax.activation)和反射限制问题,无法真正启动;
- cassandra-driver-core:3.11.3 与 java-driver-core:4.15.0 混用需确保协议兼容(两者均支持 CQL v4,但建议统一使用 4.x 驱动);
- Windows 平台下 Testcontainers 依赖 Docker Desktop,请确保 WSL2 后端已启用并资源充足。
综上,JDK 17 环境下应放弃 cassandra-unit,转向 Testcontainers + 官方 Cassandra 镜像——这不仅解决兼容性问题,更提升测试真实性和可维护性。











