AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

macOS 環境の ColdFusion 2023 (JRE17) で jmxremote ができなかった

jmxremote

java の引数に指定する、いわゆるこういうやつ。

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.registry.ssl=false

これが掲題の通り、 macOS 環境の ColdFusion 2023 (JRE17) で動作しなかった。

今ってデフォルトで有効化されてんじゃないの?

確認する限りだと Java 8 あたりでデフォルト有効化されているっぽかった。

docs.oracle.com

docs.oracle.com

とはいえ以下のような記事もあり、過去には ColdFusion 付属の JRE 環境でも jmxremote が動いている模様は観測されていた。

serverfault.com

boncode.blogspot.com

動かなかった理由

わからん。

jvm.config ファイルを直接編集したり、 ColdFusion Administrator の JavaJVM 項目から変更してみたりしたけど、結局バンドルされている JRE では動作させることができなかった。

結局どうした

掲題の通り macOS 環境で、なおかつ anyenv を利用していたので、 jenv をインストールしてから brewopenjdk@17 パッケージをインストールして、 ColdFusion を配置したディレクトリ以下で jenv local openjdk64-17.0.8.1 などしたあと、 ColdFusion が利用する Java を入れ替えた。

cfassociates.samuraiz.co.jp

手順

備忘録として雑に記載しておく。

❯ anyenv install jenv
❯ exec $SHELL -l
❯ brew install openjdk@17
❯ jenv enable-plugin exportexec $SHELL -l
❯ sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk
❯ echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
❯ jenv add `/usr/libexec/java_home -v "17"`cd ~/Workspace/ColdFusion_2023_WWEJ_macos
❯ jenv local openjdk64-17.0.8.1

この後 ColdFusion Administrator なり jvm.config ファイルなりから Java へのパスを書き換えて ColdFusion プロセスを再起動すれば設定される。

〜などを使うとうまく読み取ってくれないので pwd でフルパスを表示させておくと良い

ちなみにシンボリックリンクを貼るトコは brew でインストール時に表示されるが、忘れた場合は brew info すると教えてくれるので活用しよう。

❯ brew info openjdk@17
==> openjdk@17: stable 17.0.8.1 (bottled) [keg-only]
Development kit for the Java programming language
https://openjdk.java.net/
/opt/homebrew/Cellar/openjdk@17/17.0.8.1 (635 files, 305MB)
  Poured from bottle using the formulae.brew.sh API on 2023-10-16 at 18:25:37
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/o/openjdk@17.rb
License: GPL-2.0-only with Classpath-exception-2.0
==> Dependencies
Build: autoconf ✘, pkg-config ✔
Required: giflib ✔, harfbuzz ✘, jpeg-turbo ✔, libpng ✔, little-cms2 ✔
==> Requirements
Build: Xcode (on macOS)==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

openjdk@17 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have openjdk@17 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk@17 you may need to set:
  export CPPFLAGS="-I/opt/homebrew/opt/openjdk@17/include"
==> Analytics
install: 30,027 (30 days), 91,023 (90 days), 185,024 (365 days)
install-on-request: 20,494 (30 days), 61,393 (90 days), 109,428 (365 days)
build-error: 106 (30 days)

openjdk への切替後

改めて jmxremote 周りの記述を jvm 設定として投入する。

結局これを設定して何がしたかったか、というと、VisualVM などで JVM メトリクスをウォッチしたかった。

無事取得できた

ある処理がデータ取得・整形など走ったりしていてめちゃくちゃ重く、なおかつ集計対象として時間軸に比例して増えるテーブルをフルスキャンする仕様で、直接 JVM 側にアタッチしたかったという所から始まったのだけど、めちゃくちゃ時間がかかってしまった。 次はリファクタリングだ……。

というわけで jmxremote がなんか動かねえんだけど! という人はバンドルされている Oracle JRE から OpenJDK などに変更してみてください。 ちなみにこれ本番系では推奨されない (動作保証環境から逸脱する) のは当然なので、開発や検証などの環境にとどめておきましょう。