2.

Maven「Fatal error compiling: 1.X は無効なターゲット・リリース」原因と対処

編集
この記事の要点
  • Maven の Fatal error compiling: 1.X は無効なターゲット・リリースです
  • 原因: pom.xml で指定した Java バージョンと実行中の JDK が不一致
  • 対処: mvn -version で実行 JDK を確認 → JAVA_HOME を pom と合わせる
  • Java 9 以降は 1.9 ではなく 11 / 17 の形式で指定(古い書き方は無効)
  • maven.compiler.source / target または release プロパティを利用

エラー内容

Fatal error compiling: 1.X は無効なターゲット・リリースです

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
  (default-compile) on project myapp:
  Fatal error compiling: 無効なターゲット・リリース: 11 -> [Help 1]

# 英語環境では
[ERROR] Failed to execute goal ...:
  Fatal error compiling: invalid target release: 11

1.X の部分には 1.8 / 11 / 17 など、pom.xml で指定した Java バージョンが入ります。

原因

Maven は実行されている JDK のバージョンと、pom.xml が要求しているバージョンを照合します。両者の不一致でこのエラーが出ます:

  • pom.xml: Java 17 を要求
  • 実行 JDK: Java 11
  • → Java 11 では Java 17 を target にできない → エラー

その逆(Java 17 で Java 8 を target)は OK ですが、新しい Java 機能が使えなくなります。

対処1: 実行 JDK を確認

# Maven が使っている JDK を確認
mvn -version

# 出力例
# Apache Maven 3.9.5
# Maven home: /usr/share/maven
# Java version: 11.0.20, vendor: Eclipse Adoptium, runtime: /usr/lib/jvm/temurin-11-jdk-amd64
# Default locale: ja_JP, platform encoding: UTF-8
# OS name: "linux", version: "5.15.0", arch: "amd64"

# 環境変数
echo $JAVA_HOME
which java
java -version

# Windows
echo %JAVA_HOME%
where java
java -version

対処2: JAVA_HOME を切り替え

# Linux / Mac
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
mvn -version  # 確認

# 永続化(.bashrc / .zshrc)
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc

# Windows (PowerShell)
$env:JAVA_HOME = "C:\Program Files\Java\jdk-17"
$env:PATH = "$env:JAVA_HOME\bin;$env:PATH"
mvn -version

# Windows 永続化: 環境変数の編集 (システムプロパティ → 環境変数)

対処3: pom.xml の指定方法を修正

古いやり方:



    1.8
    1.8



正しい書き方:



    11
    11




    17




    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.11.0
            
                17
                17
                
                17
            
        
    

Java バージョン記法の歴史

Java記法(古い)記法(新しい)release 推奨
Java 51.55×
Java 61.66×
Java 71.77×
Java 81.88×
Java 9(NG)9
Java 11 (LTS)(NG)11
Java 17 (LTS)(NG)17
Java 21 (LTS)(NG)21

release vs source + target の違い

source + targetrelease
使えるバージョンJava 5+Java 9+
言語仕様source で指定release で指定
バイトコードtarget で指定release で指定
標準 API の制限制限なし(新しい API も使える可能性)★ 指定バージョンの API のみ使える(厳密)
クロスコンパイル不完全確実

release の方が厳密。例えば「Java 8 互換」を --release 8 で指定すると、Java 11 でJava 8 にない API(Stream.toList() 等)はコンパイルエラーになる。これが正しい挙動。

対処4: Maven Toolchains で複数 JDK 管理

1 つのマシンで複数 Java バージョンを使い分けるならツールチェーン:



    
        jdk
        
            1.8
            oracle
        
        
            /usr/lib/jvm/jdk1.8.0_311
        
    
    
        jdk
        
            17
        
        
            /usr/lib/jvm/jdk-17
        
    




    org.apache.maven.plugins
    maven-toolchains-plugin
    
        
            
                17
            
        
    
    
        
            toolchain
        
    

対処5: sdkman / jenv で JDK 切替

# sdkman で複数 JDK 管理
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

sdk install java 17.0.10-tem      # Java 17 (Temurin)
sdk install java 11.0.22-tem      # Java 11
sdk install java 8.0.402-tem      # Java 8

# 切替
sdk use java 17.0.10-tem
sdk default java 11.0.22-tem      # デフォルトに

# プロジェクトディレクトリで自動切替
echo 'java=17.0.10-tem' > .sdkmanrc
sdk env install

# jenv (Mac で人気)
brew install jenv
jenv add /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
jenv global 17.0

CI/CD での JDK 指定

# GitHub Actions
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'maven'
      - run: mvn -B clean package

関連エラー

  • UnsupportedClassVersionError: 実行時の JDK が古くてビルド済みクラスを読めない
  • has been compiled by a more recent version of the Java Runtime: 同上
  • Class file is Java X but supports Java Y: bytecode バージョン違い
  • illegal reflective access: Java 9+ のモジュール制約

確認用コマンド

# 効いているプロパティ
mvn help:effective-pom | grep -A 3 "maven.compiler"

# プラグインに渡されている設定
mvn -X compile 2>&1 | grep -i "source\|target\|release"

# Java バージョン強制
mvn -Dmaven.compiler.source=17 -Dmaven.compiler.target=17 compile
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format
  2. Fatal error compiling: 1.Xは無効なターゲット・リリースです