yak shaving life

遠回りこそが最短の道

HomebrewでJmeterをインストールしたらちゃんと動かなかった

諸事情によりJmeterGUIを動かしたかったのでMacでのインストール方法を調べると、Homebrewにあるとのことだったのでインストールした。が、ちゃんと動かなかったのでやったことをメモ。

環境

macOS 10.15.13(Catalina), JavaはOpenJDK 11.0.4, MacBook Pro Early 2015。M1 Macの新しいやつほしい。

事象

brew install jmeterJmeterをインストールして、jmeterコマンドでGUIを実行。WARNING: package sun.awt.X11 not in java.desktopとかいうのが出てるからなんとなく嫌な予感がしたが、一部の機能が動かない。具体的には File -> Open を押しても何も起こらない。(何もできねえ…)

ターミナルを見るとこんなエラーが出力されている。

Uncaught Exception java.lang.IllegalAccessError: class com.github.weisj.darklaf.ui.filechooser.DarkFilePaneUIBridge$DetailsTableModel (in unnamed module @0x4c40b76e) cannot access class sun.awt.shell.ShellFolder (in module java.desktop) because module java.desktop does not export sun.awt.shell to unnamed module @0x4c40b76e in thread Thread[AWT-EventQueue-0,6,main]. See log file for details.

なるほどわからん。ログファイルを見ろと言われているので、カレントディレクトリに生成されているjmeter.logを見る。

2021-10-26 01:27:40,693 ERROR o.a.j.JMeter: Uncaught exception in thread Thread[AWT-EventQueue-0,6,main]
java.lang.NoClassDefFoundError: Could not initialize class org.apache.jmeter.gui.util.FileDialoger
        at org.apache.jmeter.gui.action.Load.doActionAfterCheck(Load.java:75) ~[ApacheJMeter_core.jar:5.4.1]
        at org.apache.jmeter.gui.action.AbstractActionWithNoRunningTest.doAction(AbstractActionWithNoRunningTest.java:44) ~[ApacheJMeter_core.jar:5.4.1]
        at org.apache.jmeter.gui.action.ActionRouter.performAction(ActionRouter.java:87) ~[ApacheJMeter_core.jar:5.4.1]
        at org.apache.jmeter.gui.action.ActionRouter.lambda$actionPerformed$0(ActionRouter.java:69) ~[ApacheJMeter_core.jar:5.4.1]
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) ~[?:?]
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771) ~[?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:722) ~[?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:716) ~[?:?]
        at java.security.AccessController.doPrivileged(AccessController.java:399) ~[?:?]
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) ~[?:?]
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:741) ~[?:?]
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]
2021-10-26 01:27:40,842 ERROR o.a.j.JMeter: Uncaught exception in thread Thread[AWT-EventQueue-0,6,main]
java.lang.NoClassDefFoundError: Could not initialize class org.apache.jmeter.gui.util.FileDialoger
        at org.apache.jmeter.gui.action.Load.doActionAfterCheck(Load.java:75) ~[ApacheJMeter_core.jar:5.4.1]
        at org.apache.jmeter.gui.action.AbstractActionWithNoRunningTest.doAction(AbstractActionWithNoRunningTest.java:44) ~[
ApacheJMeter_core.jar:5.4.1]
        at org.apache.jmeter.gui.action.ActionRouter.performAction(ActionRouter.java:87) ~[ApacheJMeter_core.jar:5.4.1]
        at org.apache.jmeter.gui.action.ActionRouter.lambda$actionPerformed$0(ActionRouter.java:69) ~[ApacheJMeter_core.jar:5.4.1]
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) ~[?:?]
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771) ~[?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:722) ~[?:?]
        at java.awt.EventQueue$4.run(EventQueue.java:716) ~[?:?]
        at java.security.AccessController.doPrivileged(AccessController.java:399) ~[?:?]
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) ~[?:?]
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:741) ~[?:?]
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]

なるほどわからん(2分ぶり2回目)。とりあえずorg.apache.jmeter.gui.util.FileDialogerがクラスパスにないんだろうけどどうすればいいやら。

解決策

エラーメッセージ等でしばらくググって色々試したけどどうも解決できず。Javaのバージョン下げろとか上げろとか色々書いてあったので、jenvを入れて8とか17とかも試してみたけど変わらず。

こいつはちょっとヤクすぎる(yak shavingすぎる)なと感じ始めたので、別のアプローチを試すことに。[Jmeter公式]に行くとバイナリをダウンロードできるので、これをダウンロードしてみることに。その間にhomebrew版は消しておく。

大体以下のようなコマンドを打った。

$ brew uninstall jmeter
Uninstalling /usr/local/Cellar/jmeter/5.4.1... (2,645 files, 124.4MB)

# 一応Checksumを計算してみる。ちゃんと合ってるっぽい。
$ shasum -a 512 apache-jmeter-5.4.1.tgz
bfc0faa84769b58c1fd498417b3a5c65749f52226bd6e3533f08ca7ea4a3798bb8d2cbd7091b443dd6837f3cbea5565c3c18e6497b40bec95616bf44dfdf590d  apache-jmeter-5.4.1.tgz

$ tar xzvf apache-jmeter-5.4.1.tgz
(出力略)

$ cd apache-jmeter-5.4.1/bin/

$ sh jmeter.sh
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
   jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
   Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================

お、Homebrew版で出ていたWARNINGが出てない!これは期待!

ということで、実際に立ち上がったGUIではFile -> Openも動きました。エラー出力もなし。めでたしめでたし。

Homebrew版のエラーを解消する方法は結局分からなかったけど、まあ動いたからよしとしよう。今日もyakをshavingしたので人生を生きているなあ。