⛰️

jenvでスムーズにJavaのバージョンを切り替えよう(mac)

に公開

概要

複数のJavaバージョンをディレクトリ単位で自動的に管理や切り替えをするバージョン管理ツールjenvの導入法、利用法についてのメモ。
大規模な開発でライブラリごとに異なるバージョンを使用する場合のめんどくさい切り替えを解消しましょう。

この記事で伝えたいこと

筆者は、バージョン切り替えが必要になる状況で、.zshrcで複数のJAVA_HOMEを書いてコメントアウトし、いちいち書き換えていた。あまりにめんどくさいので自動で切り替える方法を習得する。

解決したい課題

  • プロジェクト毎の環境設定の手間: 大規模開発環境において、プロジェクトやライブラリごとに使用するJavaバージョンが異なり、毎回手作業でJAVA_HOMEを変更するのは非常に手間がかかる。
  • 人的ミスの防止: 手動で環境変数をいじるため、設定ミスやビルドエラーのリスクが高まる。

課題の原因

  • 手動設定の非効率: プロジェクト数が増えると、その都度.zshrcを編集し、環境切替のためのsourceコマンドを実行する必要があり、作業工程が冗長でミスが発生しやすくなる。
  • 複数バージョン管理の複雑さ: 異なるバージョンが混在する環境では、正しいバージョンの選択ミスにより、無駄な時間を費やされてしまうことも。

課題を解決する技術、手法

jenvを活用して、自動でJavaバージョンを切り替える手法を採用することで、上述の課題を解消します。

手順

  • jenvの導入と設定

    • Homebrewを利用してjenvを簡単にインストールする。
    • シェル初期化ファイル(.zshrc)にjenvのパス設定と初期化スクリプトを追加し、適切に反映させる。
  • Javaバージョンのインストール

    • Homebrew Caskを利用して、Amazon Corretto 17、Temurin 21など必要なJavaバージョンを導入する。
  • jenvへの登録

    • /usr/libexec/java_home -V でインストール済みのJavaパスを確認し、そのパスを用いてjenvに追加する。
    • ※ jenvは登録済みJava情報を~/.jenv/versionsへシンボリックリンクとして保存します。このディレクトリが存在しない場合、エラーが発生するため、事前にmkdir -p ~/.jenv/versionsを実行して作成しておきます。
  • グローバル/ローカルの設定活用

    • jenv global <version> でシステム全体のデフォルトJavaバージョンを設定する。
    • プロジェクトディレクトリ内でjenv local <version> を実行し、そのディレクトリ専用のJavaバージョンを適用する。

技術、手法の概要

  • jenvの導入と設定
    • Homebrewを利用して、jenv を簡単にインストールします。
brew install jenv
  • 次に、シェル初期化ファイル(.zshrc)に以下の記述を追加してください。
    ※ これは、jenv のバイナリパスと初期化スクリプトを読み込むための設定です。
# jenv
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"

コマンドで行う場合は以下を実行

echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
  • ファイル保存後、設定を反映させるためにターミナルで以下を実行
source ~/.zshrc
  • Javaバージョンのインストール

    • Homebrew Cask を利用して、Amazon Corretto 17 や Temurin 21 など、必要なJavaバージョンをインストールします。
    • 今回は、既にインストールされている Java を使用しますので、現状のJava(例として /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home)を対象に登録します
  • jenvへの登録(test環境での登録)

    • まず、ターミナルで /usr/libexec/java_home -V を実行して、インストール済みのJavaのパスを確認してください。
/usr/libexec/java_home -V
Matching Java Virtual Machines (4):
    21.0.5 (arm64) "Oracle Corporation" - "Java SE 21.0.5" /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
    21.0.3 (arm64) "Eclipse Adoptium" - "OpenJDK 21.0.3" /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home
    17.0.14 (arm64) "Amazon.com Inc." - "Amazon Corretto 17" /Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
    17.0.9 (arm64) "JetBrains s.r.o." - "JBR-17.0.9+8-1166.2-nomod 17.0.9" /Users/kijimariku/Library/Java/JavaVirtualMachines/jbr-17.0.9/Contents/Home
  • 今回は、test用として、以下のパスのJavaバージョンを登録します
jenv add /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
  • ※ jenv は、登録済みのJava情報を ~/.jenv/versions にシンボリックリンクとして保存します。このディレクトリが存在しない場合、エラーが発生するため、事前に以下のコマンドでディレクトリを作成しておく必要があります。
mkdir -p ~/.jenv/versions

登録できると、jenv versions で確認できます。

jenv versions
  system
  17
  17.0
  17.0.14
* 21 (set by hogehoge)
  21.0
  21.0.3
  21.0.5
  corretto64-17.0.14
  oracle64-21.0.5
  temurin64-21.0.3
  • グローバル/ローカルの設定活用
    • グローバル設定: システム全体のデフォルトJavaバージョンとして設定したい場合は、以下のコマンドを実行
jenv global 17

  • ローカル設定: プロジェクトディレクトリ専用のJavaバージョンを設定するには、対象ディレクトリ内で次のように実行
jenv local 21

これにより、そのディレクトリに専用の `.java-version` ファイルが作成され、ディレクトリ内では自動で指定のバージョンが適用されます。

簡単にまとめると、
jenv global 17でシステムデフォルトはjava 17になる
→ ~/jenv_testで jenv local 21 をしたためこのディレクトリではjava 21
→ ~/jenv_test2 ではデフォルトが適用されるためjava 17

ディレクトリごとに自動で切り替わっていることがわかります。

グローバル設定とローカル設定を併用することで、必要に応じた効率的なJava環境管理が可能になり、開発生産が上がります!

Discussion