我发现 Cassandra 仅支持 JDK17,不支持任何 Java 风格。首先,我安装了 OpenJDK11,并收到了与以下相同的消息。
然后我发现 Cassandra 5.0 仅支持 JDK17。好吧,如果是这样的话,他们可能应该更改消息,但没关系。然后我安装了 OpenJDK17,但仍然收到以下信息。
$ which java
/usr/lib/jvm/java-17-openjdk-amd64/bin/java
$ java -version
openjdk version "17-ea" 2021-09-14
OpenJDK Runtime Environment (build 17-ea+11-Ubuntu-114.042)
OpenJDK 64-Bit Server VM (build 17-ea+11-Ubuntu-114.042, mixed mode, sharing)
vm1@ubuntu:/opt/apache-cassandra-5.0.0/bin$ ./cassandra
Cassandra 5.0 requires Java 11 or Java 17.
然后我尝试使用 Oracle Java 17,结果相同。发生了什么?
$ which java
/usr/lib/jvm/java-17-oracle/bin/java
$ java -version
java version "17.0.6" 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)
vm1@ubuntu:/opt/apache-cassandra-5.0.0/bin$ ./cassandra
Cassandra 5.0 requires Java 11 or Java 17.
因此,Cassandra 使用cassandra.in.sh中的以下代码确定您的 JVM 版本:
当我强制
java -version
上面显示的输出时,我的变量short
等于 17。这应该没问题。但是,此代码块上方还有另一个代码块,用于检查是否存在
$JAVA_HOME
环境变量。如果您的环境中设置了环境变量,则会使用它。您可以尝试的一件事是编辑本地 bin/cassandra.in.sh 文件中的错误消息以包含失败的版本号:
我很好奇想知道那会说什么。
背景
长期以来,Apache Cassandra 仅适用于 Java 8。2015 年,开始致力于添加对 Java 新版本(特别是 Java 9 和 10)的支持。然而,情况在 2017 年发生了变化,当时Oracle 宣布了 6 个月的发布周期,这最终意味着 Java 版本将以快速的速度达到 EOL。
LTS 支持
因此,Cassandra 社区决定仅认证具有长期支持 (LTS) 的 Java 版本。在 C* 4.0 中,添加了对 Java 11 LTS 的支持 ( CASSANDRA-9608、CASSANDRA-16894 ),因此它可与 Java 8 和 11 兼容。
Cassandra 5.0 增加了对 Java 17 LTS 的支持并放弃了对 Java 8 的支持(CASSANDRA-18255),这意味着C* 5.0 可以同时适用于 Java 11 和 17。
您的环境
从以上内容中,我希望可以清楚地知道支持哪些版本的 Java,并且问题出在您正在运行的 VM 上,因为症状指向 OS/shell 环境的潜在问题。
我怀疑您安装了多个版本的 Java,并且系统对于配置了哪个 Java 安装感到困惑。
当您运行
bin/cassandra
脚本启动 Cassandra 时,它还会运行bin/cassandra.in.sh
脚本(第 82 行),然后验证已安装的 Java 版本。您需要调试脚本以找出它无法在您的 VM 中运行的原因。首先要验证
JAVA_HOME
(1) 是否已在您的 shell 配置文件中设置,以及 (2) 是否指向您未预料到的 Java 安装。如果
JAVA_HOME
未设置,则(3)运行以下命令来评估 shell 选择了哪个 Java 安装:如果它是符号链接,(4)一直跟踪它,直到识别出安装。
如果其他方法都失败了,请逐行调试
cassandra.in.sh
并运行命令,特别是从第 99 行开始,直到找出根本原因。干杯!