IntelliJ で Java のビルド時にバージョン関係ではまった時に確認する箇所
概要
小ネタ系
Intellij でJava の開発をしていて、ビルド時にエラーになってしまう、
特にコードの構文が合っているのにエラーになってしまう場合に、
どこをどのように確認・修正するばいいのかについてまとめてみました。
自分は Java17 の preview 機能を使おうと思い、
実装してビルドしようとすると設定不備で以上の事象に遭遇し、
何か所か修正する必要があったので、その内容についてまとめています。
今回の内容は「17(Preview) - Pattern matching for switch」に設定し、
該当機能がビルド・実行ができるようにする設定について記載しています。
環境
確認環境やツールのバージョンについて。
私はWindows を使っているので、以下の環境で確認しました。*1
操作についてはわかる範囲は Mac についても記載してます。
確認する箇所
その1:プロジェクト設定のJava・JDKの設定があっているか確認する
プロジェクト設定のプロジェクト設定に Java や JDK の設定があります。
これが期待する設定になっているか確認します。
プロジェクト設定の開き方は以下
- Windows, Mac 共通
- [File] -> [Project Structure...]を選択
- 「Project Structure」ダイアログが開いて、[Project Settings] -> [Project] を選択します
今回は Java 17 を使いたいので、version 17 のものである「openjdk-17」を選択します。
必要な jdk がインストールされてない場合は下のほうにある Add SDK から追加でダウンロードできます。ダウンロード後に設定してください。
「Project language level」の設定を対象のバージョンに設定します。
今回は「17(Preview) - Pattern matching for switch」を選択し、設定します。
これらの設定が完了したらダイアログの右下の 「Apply」を押して設定反映します。
その2:プロジェクト設定のモジュールにある言語レベルを確認する
プロジェクトのモジュール設定は以下の方法で開きます
- Windows, Mac 共通
- [File] -> [Project Structure...]を選択
- 「Project Structure」ダイアログが開いて、[Project Settings] -> [Modules] を選択します
プロジェクトを選択し、「Sources」タブの中にある「Language level」から設定したい Java のバージョンを選択します。
今回は「17(Preview) - Pattern matching for switch」を選択し、設定します。
設定が完了したら、ダイアログの右下の「Apply」をクリックし、設定を反映します。
その3:ビルドツールのJVM設定が必要な Java バージョンになっているか確認する
ビルドツール側の Java が正しいか確認します。
実行時に使用する設定が間違っていると、IDEから実行した時にエラーになる場合があります。
私は Gradle を使っているので Maven など他のビルドツールを使っている場合は、対象の設定を確認してください。
ビルドツールの設定は以下の手順で開きます。
- Windows
- [File] -> [Settings...]を選択
- 「Settings」ダイアログを開いて、[Build, Execution, Deployment]-> [Build Tools]からプロジェクトで使用しているビルドツールの設定を開く
- Mac
- [IntelliJ IDEA] -> [Preferences...]を選択
- 「Settings」ダイアログを開いて、[Build, Execution, Deployment]-> [Build Tools]からプロジェクトで使用しているビルドツールの設定を開く
ビルドツールの設定を開き、JVMなどの設定が対象の設定になっているか確認します。
Gradleの場合は「Gradle JVM」の設定を確認します。
設定を変更した場合、右下の 「Apply」をクリックし、設定を反映します。
その4:ビルドツールの設定ファイルにJavaバージョン設定が正確にされているか確認する
ビルドツール側の設定ファイルに読み込む Java のソースコードバージョンを設定できる項目があります。
Gradleの場合は sourceCompatibility
、targetCompatibility
がそれです。*2
この設定を確認する理由は、 IntelliJ IDEA はビルドツールで指定した設定を優先するため、この設定がビルドツールの設定ファイル側にあると、いままで設定した項目を上書きしてしまいます。
使いたいバージョンか、それ以上のバージョンになっているか。を確認します。
今回は Java 17 preview 機能を使いたいため、build.gradle
に以下の設定があるか確認します。
sourceCompatibility = '17'
targetCompatibility = '17'
以上の設定が完了したら、ビルドツールの設定ファイルの再読み込みを実行します。
おまけ
本筋と異なりますが、preview 機能使いたい場合の方法についても、ちょっとわかりにくいので書かせてもらいます。
Java の preview 機能と使いたい場合、そのままでは使うことができず、
コンパイル・実行時にオプション引数として --enable-preview
を付与する必要があります。
このオプションを有効にする設定はビルドツールの設定ファイルに追記することもできます。
以下の記述を build.gradle
に記述します。
tasks.withType(JavaCompile) {
options.compilerArgs += "--enable-preview"
}
tasks.withType(Test) {
jvmArgs += "--enable-preview"
}
tasks.withType(JavaExec) {
jvmArgs += '--enable-preview'
}
最後に
IntelliJ で Javaのビルド時に参照される設定を把握するのは難しかったので、今回のエントリーを記載しました。
Java のプロジェクト設定を直すとよい、という情報を参考に設定を変更しても、実行時に失敗してしまい、
設定を再確認すると設定が別のJavaバージョンで上書きされていて「なんでだ?」と思ったら、ビルドツールのsourceCompatibility
が悪さをしていたりと、
動かすまでが大変だったので、そういった同じ罠にはまる人の参考になればと思います。