目前 RockerMQ 的最新版本是 4.9.2,這個版本在 Java 11 下是無法執行的:
[rocketmq@localhost 00-rocketmq-4.9.2]$ java -version
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)
[rocketmq@localhost 00-rocketmq-4.9.2]$ bin/mqnamesrv
-Djava.ext.dirs=/jre/lib/ext:/home/rocketmq/00-rocketmq-4.9.2/bin/../lib:/lib/ext is not supported. Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit
相關的 issue 在這裡,到目前為止仍然是 open 狀態。
我們可以看到,之所以執行失敗,主要是因為啟動指令碼中的 JVM 引數問題。
說到這裡我想勸各位釋出類似開源專案的時候,指令碼里面不要帶上一大堆的 -XX:
調優引數,這些應該交給使用者自己去調整,因為你不知道使用者用的是什麼 JVM,你不要強行幫使用者去“優化”,只要留個口子就行了。
既然是指令碼的問題,那麼修改下指令碼就可以了:
開啟 runserver.sh
和 runbroker.sh
(Windows 下則是相應的 .cmd 字尾),做如下修改(修改前記得備份):
- 找到包含
-Djava.ext.dirs
引數的行,將該行刪除或註釋掉; - 找到包含
-Xloggc
引數的行,將該行刪除或註釋掉; - 找到包含
-XX:+UseGCLogFileRotation
引數的行,將該行刪除或註釋掉; - 找到包含
export CLASSPATH=
的行(在檔案的前面部分),將等號後面的內容改為.:${BASE_DIR}/conf:${BASE_DIR}/lib/*:${CLASSPATH}
- 找到包含
-XX:-UseLargePages
引數的行,在它的下面新增一行JAVA_OPT="${JAVA_OPT} --add-exports java.base/jdk.internal.ref=ALL-UNNAMED"
經過這樣的修改,RocketMQ 就可以在 Java 11 下成功啟動了。