かすみん日記

暇なときに何か喋ります

【Mac】Java開発の環境構築(JDK, Homebrew, VSCode)

MacJavaの開発環境を構築します。

HomebrewでopenJDKのバージョン11をインストールして、VSCodeでも使えるようにします。

環境

Java開発の環境構築

Javaの開発環境を構築するには、JDKというコンパイラやその他もろもろがまとめられたモノをインストールすれば良い。

JDK」自体は一般的な概念だが、実物としてはいろいろなところから提供されているらしい(OracleとかMicrosoftとか)。

JDKは提供元の各サイトのダウンロードページから入手することができるが、今回はHomebrewを使ってインストールすることにする。

まずはどんなJDKがHomebrewに登録されているか確認する。brew searchコマンドを実行してみる:

% brew search jdk
==> Formulae
openjdk            openjdk@11         openjdk@17         openjdk@8          jd                 mdk                cdk

==> Casks
adoptopenjdk                      microsoft-openjdk                 oracle-jdk-javadoc                semeru-jdk-open
jdk-mission-control               oracle-jdk                        sapmachine-jdk

いろいろあるけど、今回はopenJDKのバージョン11をインストールしてみる。 下記コマンドを実行:

brew install openjdk@11

このパッケージは「keg-onlyなパッケージ」なので、シンボリックリンクは自動で作られない。 そのため、自分でシンボリックリンクを作るか、パスを通すなどをしなければならない。

ちなみに、macだと多分標準でjavajavacが既にインストールされている。

% java --version 
java 13.0.2 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)

% javac --version
javac 13.0.2

これからパスの設定をして、javajavacと打ったときにちゃんと新しくインストールしたものに変更されているか確認する。

Homebrewからインストールしたopenjdk@11に含まれているjavaコマンドなどは、以下のディレクトリに配置されている:

/usr/local/opt/openjdk@11/bin

そのため、このディレクトリにパスを通す。

使用しているシェルがzshの場合には、~/.zshrcファイルにパスを追加するためのコマンドを書けばいい。 bashなら~/.bash_profileに書く。

ターミナルから下記コマンドを実行すれば良い:

echo 'export PATH="/usr/local/opt/openjdk@11/bin:$PATH"' >> ~/.zshrc

既存パスの左側にopenjdk@11へのパスを追加したので、これらのパスのうちに同じjavaというコマンドがあった場合にも、openjdk@11にあるjavaコマンドが優先して呼ばれるはず。

シェルの設定ファイル再読み込みする:

source ~/.zshrc

そのあと、もう一度javajavacコマンドを実行してみると、ちゃんとインストールしたバージョンが表示されていることが確認できる:

% java --version 
openjdk 11.0.15 2022-04-19
OpenJDK Runtime Environment Homebrew (build 11.0.15+0)
OpenJDK 64-Bit Server VM Homebrew (build 11.0.15+0, mixed mode)

% javac --version
javac 11.0.15

whichコマンドでも確認できる:

% which java
/usr/local/opt/openjdk@11/bin/java

% which javac
/usr/local/opt/openjdk@11/bin/javac

また、HomebrewでインストールしたJDKをシステム?に認識させるには、/Library/Java/JavaVirtualMachines/以下にシンボリックリンクを作成する必要がある。

下記コマンドでシンボリックリンクを作成:

sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk

java_homeコマンドで、インストールされているJDKのバージョンを確認できる:

% /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    13.0.2 (x86_64) "Oracle Corporation" - "Java SE 13.0.2" /Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home
    11.0.15 (x86_64) "Homebrew" - "OpenJDK 11.0.15" /usr/local/Cellar/openjdk@11/11.0.15/libexec/openjdk.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home

バージョン11のHomeディレクトリのパスだけがほしい場合は、次のようにして得られる:

% /usr/libexec/java_home -v 11
/usr/local/Cellar/openjdk@11/11.0.15/libexec/openjdk.jdk/Contents/Home

実行テスト

コンパイルと実行のテストをする。

カレントディレクトリに次の内容のファイルをTest.javaという名前で保存する:

public class Test {
  public static void main(String [] args) {
    System.out.println("Hello Java!!!!!!");
  }
}

javacコマンドでコンパイル

javac Test.java

すると、Test.classというバイナリファイルが生成される。

% ls
Test.class
Test.java

最後に、javaコマンドでプログラムを実行する:

java Test
## -> Hello Java!!!!!!

ちゃんとテキストが表示されればok。

VSCodeで開発環境を構築

vscodeJava拡張機能を入れれば、ボタンをポチポチするだけでプログラムを実行できるようになる。

vscode拡張機能検索窓にjavaと入れて、上の方に表示される「Extension Pack for Java」をインストールする。

次に、java_homeの設定を行う。

使いたいバージョンのjava_homeのパスをメモっておく。

パスはjava_homeコマンドで知ることができる:

% /usr/libexec/java_home -v 11
/usr/local/Cellar/openjdk@11/11.0.15/libexec/openjdk.jdk/Contents/Home

vscodeに戻って、cmd + ,で設定を開く。

java.jdt.ls.java.homeと検索して表示される項目で、「settings.json で編集」というところをクリックする。 あるいは、普通にsettings.jsonを開く。

一番外側にある括弧{ }の中に、java homeを設定するコードを追加する。 { }内に既に何か書いてある場合は、カンマ,で区切ってから追加する。

例えば、以下のような感じ:

"java.jdt.ls.java.home": "/usr/local/Cellar/openjdk@11/11.0.15/libexec/openjdk.jdk/Contents/Home",

再起動とかを勧められたら適宜行う。

以上で設定は完了。

テストをするには、さっきのTest.javavscodeで開いて、タブの右側にあるボタンを押すか、mainメソッドの上に表示されている「Run」を押す。

そしたら、実行結果がエディタ内ターミナルに表示される。

このときに、ちゃんとjava homeを指定したバージョンのjavaが呼ばれていることを確認する。

以上!

疑問

よく環境変数$JAVA_HOMEを設定しましょうみたいな話があるが、やる意味あるのか疑問。

使いたいバージョンのjavajavacコマンドがちゃんと呼ばれてたら十分だと思う。

$JAVA_HOMEを設定したとしても、vscodesettings.jsonで改めて設定しないとそのバージョンのjavaは呼ばれないし、そもそも誰が$JAVA_HOMEなんていう変数を参照しているのか不明。

というわけで、環境変数$JAVA_HOMEを設定する意味はないかと思う。

参考

メモ

brew install openjdk@11を実行したときに表示された指示書(?)。

For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk

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

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

For compilers to find openjdk@11 you may need to set:
  export CPPFLAGS="-I/usr/local/opt/openjdk@11/include"

CPPFLAGSの設定はしていないけど、一応java動いたし、やらんでいいのかな?

環境変数CPPFLAGSの意味がよくわからんので、一応メモとして残しておく。