SHIBUYA 3%

(元在宅が)渋谷で働くエンジニアの備忘録的memo & 雑記 - ココロはいつもSHIBUYAに在り

Javaのバージョンをコマンドで簡単に切り替える(Mac限定)

最近java9でいろいろイジりながらも、職場はまだ8だったり、java系のツールでjava9で動かないこともあり簡単に切り替える方法ないかと模索していて、個人的な着地点を見つけれたのでメモ。

環境

  • Mac Sierra
  • Python2系(Macのデフォルトで入ってたやつ)
  • peco
  • zsh

コマンド

export JAVA_HOME=`/usr/libexec/java_home -X | python -c 'import sys, plistlib; plist = plistlib.readPlist(sys.stdin); print "\n".join(str(dict["JVMVersion"]) for dict in plist)' | peco | xargs /usr/libexec/java_home -v`

f:id:fukurou31:20171023035715p:plain

PlistBuddyで出来るかと思ったんですが引数に渡せるのがファイルパスのみで、一時ファイルを作成する必要があったため、plist文字列を直接読み込めるようにPythonで書いてます。
Pythonが分からなさすぎる。。もう少し効率的な書き方があればご教授ください。

zshの設定ファイルに以下Functionを定義(よくjmcコマンドと誤爆する)

jvc() { export JAVA_HOME=`/usr/libexec/java_home -X | python -c 'import sys, plistlib; plist = plistlib.readPlist(sys.stdin); print "\n".join(str(dict["JVMVersion"]) for dict in plist)' | peco --prompt "Switch Java Version >" | xargs /usr/libexec/java_home -v` }

Javaでテスト用の空きポートを取得する(TCP)

数行で書けたのでメモ。
(今回の書き方は取得してすぐに解放しているので、実際に取得ポートを取得するまでの僅かな間に、参照できなくなる可能性もあります。)

    public static int getFreePort() {
        return IntStream.range(1025, 65535)
                .filter(i -> {
                    try (ServerSocket socket = new ServerSocket(i, 1, InetAddress.getByName("localhost"))) {
                        return true;
                    } catch (IOException e) {
                        return false;
                    }
                })
                .findFirst().orElseThrow(IllegalStateException::new);
    }

UDPDatagramSocketを使えばいける模様。