おおくまねこ

職業プログラマーです。興味のある話題を書いています。

IntelliJ で Java のビルド時にバージョン関係ではまった時に確認する箇所

概要

小ネタ系

IntellijJava の開発をしていて、ビルド時にエラーになってしまう、

特にコードの構文が合っているのにエラーになってしまう場合に、

どこをどのように確認・修正するばいいのかについてまとめてみました。

 

自分は Java17 の preview 機能を使おうと思い、

実装してビルドしようとすると設定不備で以上の事象に遭遇し、

何か所か修正する必要があったので、その内容についてまとめています。

 

今回の内容は「17(Preview) - Pattern matching for switch」に設定し、

該当機能がビルド・実行ができるようにする設定について記載しています。

 

環境

確認環境やツールのバージョンについて。

私はWindows を使っているので、以下の環境で確認しました。*1

操作についてはわかる範囲は Mac についても記載してます。

確認する箇所

その1:プロジェクト設定のJavaJDKの設定があっているか確認する

プロジェクト設定のプロジェクト設定に JavaJDK の設定があります。

これが期待する設定になっているか確認します。

 

プロジェクト設定の開き方は以下

  • Windows, Mac 共通
    • [File] -> [Project Structure...]を選択
    • 「Project Structure」ダイアログが開いて、[Project Settings] -> [Project] を選択します

「Project SDK」を対象のSDKを選択します。

今回は Java 17 を使いたいので、version 17 のものである「openjdk-17」を選択します。

f:id:keyno63:20211024231857p:plain

必要な jdk がインストールされてない場合は下のほうにある Add SDK から追加でダウンロードできます。ダウンロード後に設定してください。

 

「Project language level」の設定を対象のバージョンに設定します。

今回は「17(Preview) - Pattern matching for switch」を選択し、設定します。

f:id:keyno63:20211024232834p:plain

 

これらの設定が完了したらダイアログの右下の 「Apply」を押して設定反映します。

 

その2:プロジェクト設定のモジュールにある言語レベルを確認する

プロジェクトのモジュール設定は以下の方法で開きます

  • Windows, Mac 共通
    • [File] -> [Project Structure...]を選択
    • 「Project Structure」ダイアログが開いて、[Project Settings] -> [Modules] を選択します

プロジェクトを選択し、「Sources」タブの中にある「Language level」から設定したい Java のバージョンを選択します。

今回は「17(Preview) - Pattern matching for switch」を選択し、設定します。

f:id:keyno63:20211024234217p:plain

 

設定が完了したら、ダイアログの右下の「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」の設定を確認します。

f:id:keyno63:20211024235827p:plain

設定を変更した場合、右下の 「Apply」をクリックし、設定を反映します。

 

その4:ビルドツールの設定ファイルにJavaバージョン設定が正確にされているか確認する

ビルドツール側の設定ファイルに読み込む Javaソースコードバージョンを設定できる項目があります。

Gradleの場合は sourceCompatibility 、targetCompatibility がそれです。*2

この設定を確認する理由は、 IntelliJ IDEA はビルドツールで指定した設定を優先するため、この設定がビルドツールの設定ファイル側にあると、いままで設定した項目を上書きしてしまいます。

 

使いたいバージョンか、それ以上のバージョンになっているか。を確認します。

今回は Java 17 preview 機能を使いたいため、build.gradleに以下の設定があるか確認します。 

sourceCompatibility = '17'
targetCompatibility = '17'

以上の設定が完了したら、ビルドツールの設定ファイルの再読み込みを実行します。

 

おまけ

本筋と異なりますが、preview 機能使いたい場合の方法についても、ちょっとわかりにくいので書かせてもらいます。

Javapreview 機能と使いたい場合、そのままでは使うことができず、

コンパイル・実行時にオプション引数として --enable-previewを付与する必要があります。

このオプションを有効にする設定はビルドツールの設定ファイルに追記することもできます。

以下の記述を build.gradleに記述します。

tasks.withType(JavaCompile) {
options.compilerArgs += "--enable-preview"
}

tasks.withType(Test) {
jvmArgs += "--enable-preview"
}

tasks.withType(JavaExec) {
jvmArgs += '--enable-preview'
}

 

最後に

IntelliJJavaのビルド時に参照される設定を把握するのは難しかったので、今回のエントリーを記載しました。

Java のプロジェクト設定を直すとよい、という情報を参考に設定を変更しても、実行時に失敗してしまい、

設定を再確認すると設定が別のJavaバージョンで上書きされていて「なんでだ?」と思ったら、ビルドツールのsourceCompatibility が悪さをしていたりと、

動かすまでが大変だったので、そういった同じ罠にはまる人の参考になればと思います。

*1:Java なのでその他のMacLinuxの環境でも変わらないとは思います

*2:Maven にも相当の設定があると思います