CLOVER🍀

That was when it all began.

Maven 3で、コンパイルするソースのバージョンをとりあえず簡単に指定したい場合

非常によく忘れるので、メモ。

MavenでJavaをコンパイルする時のバージョンを指定する時には、maven-compiler-pluginを使うものですが

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>17</source>
          <target>17</target>
        </configuration>
      </plugin>

Maven 3系だともっと簡単に書けます。

Java 17の場合

propertiesに、以下のように書けばOKです。Java 17の場合は、バージョン指定が「17」になります。

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

指定するバージョンの書き方を知るには、javacのドキュメントの「-source release」を見ると良いでしょう。

> 指定されたJava SEリリースのJavaプログラミング言語の規則に従ってソース・コードをコンパイルします。 releaseでは、サポートされている値は、現在のJava SEリリース、およびコマンド行ヘルプで詳細に表示される限定された数の以前のリリースです。

[javacコマンド / --source releaseまたは-source release](https://docs.oracle.com/javase/jp/17/docs/specs/man/javac.html#option-source)

確認してみましょう。

$ javac --help

こんな感じが選択肢ですね。

  --release <release>
        指定されたJava SEリリースに対してコンパイルします。サポートされているリリース: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
  -s <directory>               生成されたソース・ファイルを格納する場所を指定する
  --source <release>, -source <release>
        指定されたJava SEリリースとソースの互換性を保持します。サポートされているリリース: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
  --source-path <path>, -sourcepath <path>
        入力ソース・ファイルを検索する位置を指定する
  --system <jdk>|none          システム・モジュールの位置をオーバーライドする
  --target <release>, -target <release>
        指定されたJava SEリリースに適したクラス・ファイルを生成します。サポートされているリリース: 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17

とはいえ、これだとコンパイラの細かい設定はできないので(ヒープサイズとか)、使い捨てのプログラムとかサンプルでしか使わないですが。

普段は、エンコーディングと合わせてこんな感じで書いています。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

Java 11の場合

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

この時のjavacコマンドのドキュメントには、「-source release」に説明が書いてあります。

javac

エンコーディングと指定の組み合わせ。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

Java 8の場合

Java 8の場合は、バージョン指定が「1.8」になります。

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

Spring BootやWebアプリケーションの場合(Java 11で)

これらは、まだJava 17をサポートしていないので、Java 11以下で書いておきます。

Spring Bootを使用する場合は、こんな感じ。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>11</java.version>
    </properties>

これで、maven.compiler.sourceとmaven.compiler.targetもjava.versionを見た値になるらしいです。

https://github.com/spring-projects/spring-boot/blob/v1.2.6.RELEASE/spring-boot-starters/spring-boot-starter-parent/pom.xml#L24-L25

あとオマケで、Webアプリケーションの場合のweb.xml省略もつけて。

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>