【Mac】Java開発の環境構築(JDK, Homebrew, VSCode)
HomebrewでopenJDKのバージョン11をインストールして、VSCodeでも使えるようにします。
環境
- 2022-04-26
- macOS Monterey v12.3.1
- Visual Studio Code: v1.62.3
- Extension Pack for Java: v0.21.0
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だと多分標準でjava
やjavac
が既にインストールされている。
% 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
これからパスの設定をして、java
やjavac
と打ったときにちゃんと新しくインストールしたものに変更されているか確認する。
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
そのあと、もう一度java
やjavac
コマンドを実行してみると、ちゃんとインストールしたバージョンが表示されていることが確認できる:
% 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で開発環境を構築
vscodeでJavaの拡張機能を入れれば、ボタンをポチポチするだけでプログラムを実行できるようになる。
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.java
をvscodeで開いて、タブの右側にあるボタン▷
を押すか、main
メソッドの上に表示されている「Run」を押す。
そしたら、実行結果がエディタ内ターミナルに表示される。
このときに、ちゃんとjava home
を指定したバージョンのjava
が呼ばれていることを確認する。
以上!
疑問
よく環境変数$JAVA_HOME
を設定しましょうみたいな話があるが、やる意味あるのか疑問。
使いたいバージョンのjava
とjavac
コマンドがちゃんと呼ばれてたら十分だと思う。
$JAVA_HOME
を設定したとしても、vscodeのsettings.json
で改めて設定しないとそのバージョンのjava
は呼ばれないし、そもそも誰が$JAVA_HOME
なんていう変数を参照しているのか不明。
というわけで、環境変数$JAVA_HOME
を設定する意味はないかと思う。
参考
- https://openjdk.java.net
- https://qiita.com/gishi_yama/items/ee3526e7e7a922148333
- https://qiita.com/seri_k/items/e978c1339ce51f13e297
- https://zenn.dev/odentravel/books/c893bb0b7352f6/viewer/1aa99a
- https://xtech.nikkei.com/it/article/COLUMN/20060227/230812/
メモ
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
の意味がよくわからんので、一応メモとして残しておく。