如何在 Java 11 下執行 RocketMQ

捏造的信仰發表於2021-12-11

目前 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.shrunbroker.sh(Windows 下則是相應的 .cmd 字尾),做如下修改(修改前記得備份):

  1. 找到包含 -Djava.ext.dirs 引數的行,將該行刪除或註釋掉;
  2. 找到包含 -Xloggc 引數的行,將該行刪除或註釋掉;
  3. 找到包含 -XX:+UseGCLogFileRotation 引數的行,將該行刪除或註釋掉;
  4. 找到包含 export CLASSPATH= 的行(在檔案的前面部分),將等號後面的內容改為 .:${BASE_DIR}/conf:${BASE_DIR}/lib/*:${CLASSPATH}
  5. 找到包含 -XX:-UseLargePages 引數的行,在它的下面新增一行 JAVA_OPT="${JAVA_OPT} --add-exports java.base/jdk.internal.ref=ALL-UNNAMED"

經過這樣的修改,RocketMQ 就可以在 Java 11 下成功啟動了。

相關文章