7.

No compiler is provided in this environment (Maven) の原因と対処

編集
この記事の要点
  • Maven / Eclipse / Gradle で 「No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?」 が出るケース
  • 原因: JRE で Java を実行している(JDK が必要)。Maven は javac を含む JDK が無いとビルドできない
  • JAVA_HOME が JRE を指している、または Eclipse の Installed JREs が JRE を指していることが典型
  • 対処: ① JDK をインストール(OpenJDK / Temurin / Oracle JDK)→ ② JAVA_HOME を JDK パスに → ③ javac -version で確認
  • Eclipse は Window → Preferences → Java → Installed JREs に JDK を追加し、ワークスペース全体に適用

このエラーの概要

Maven でビルドしようとすると次のエラーで止まります:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project myapp:
[ERROR]   No compiler is provided in this environment.
[ERROR]   Perhaps you are running on a JRE rather than a JDK?

原因はシンプルで、Maven の maven-compiler-plugin がコンパイラ(javac)を見つけられないからです。JRE(Java Runtime Environment)は実行のみで javac を含まず、JDK(Java Development Kit)が必要です。

JRE / JDK の違い

項目JREJDK
主な用途Java アプリの実行Java アプリの開発 + 実行
含むコマンドjavajava + javac + jar + javadoc
サイズ
Maven でビルド×(このエラーが出る)

Java 11 以降は Oracle が JRE 単体配布を廃止し、JDK のみが配布される流れです。それでも環境変数や IDE の設定で「古い JRE を指している」状態は頻発します。

確認コマンド

# 1. java と javac が両方あるか
java -version
javac -version

# Linux/Mac で JAVA_HOME を確認
echo $JAVA_HOME

# Windows
echo %JAVA_HOME%

# Maven が認識している Java
mvn -version
# Maven home: /usr/share/maven
# Java version: 17.0.x, vendor: Eclipse Adoptium
# Java home: /usr/lib/jvm/temurin-17-jdk-amd64/jre  <- ここに /jre が付いてたらアウト

javac -versionjavac: command not found なら JDK 未インストール。mvn -version の Java home が .../jre で終わっているなら JRE を見ています。

対処 1: JDK のインストール

OpenJDK 系(Eclipse Temurin / Microsoft OpenJDK / Amazon Corretto / Azul Zulu)または Oracle JDK のいずれかを導入します。最も簡単なのはパッケージマネージャ:

# Ubuntu / Debian
sudo apt update
sudo apt install -y openjdk-17-jdk

# RHEL / CentOS / Rocky
sudo dnf install -y java-17-openjdk-devel

# macOS (Homebrew)
brew install --cask temurin@17

# Windows (Chocolatey)
choco install temurin17

# Windows (winget)
winget install EclipseAdoptium.Temurin.17.JDK

# 確認
javac -version

対処 2: JAVA_HOME を JDK に向ける

# Linux / macOS(.bashrc または .zshrc)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# macOS で自動判定
export JAVA_HOME=$(/usr/libexec/java_home -v 17)

# 反映
source ~/.bashrc

# Windows(PowerShell、永続化)
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Eclipse Adoptium\jdk-17.0.x-hotspot", "Machine")
# システム環境変数 Path に %JAVA_HOME%\bin を追加

重要: JAVA_HOME には .../jdk-17 までを設定し、.../jdk-17/jre.../jdk-17/bin含めないでください。

対処 3: Eclipse の Installed JREs

Eclipse は OS の JAVA_HOME を参照せず、Eclipse 起動時に同梱の JRE を使うことがあるため、別途設定が必要です:

  1. Window → Preferences → Java → Installed JREs
  2. Add → Standard VM → JRE home に JDK のパスを指定(例: C:\Program Files\Eclipse Adoptium\jdk-17.0.x-hotspot
  3. 追加した JDK のチェックを ON にして既定に
  4. Window → Preferences → Java → Compiler で Compliance level を 17 等に合わせる
  5. プロジェクト右クリック → Properties → Java Build Path → Libraries で JRE System Library を更新
  6. Project → Clean でビルドし直し

対処 4: Maven の pom.xml で明示

プロジェクト側でも Java バージョンと tools.jar パスを明示できます:


  
    17
    17
  

  
    
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.11.0
        
          17
          17
          
          true
          ${JAVA_HOME}/bin/javac
        
      
    
  

対処 5: ~/.mavenrc / setenv.sh

Maven 起動時の Java を強制できます:

# ~/.mavenrc
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

# またはプロジェクトに setenv.sh / mvnw を入れて wrapper 経由起動
./mvnw clean install

Windows 特有のハマりどころ

  • Oracle JRE が C:\Program Files (x86)\Java\jre1.8.0_xxx\ に残っていて PATH の先頭にいる → 削除またはPATH 順を整理
  • JAVA_HOME を変えてもコマンドプロンプトを開き直さないと反映されない
  • システム環境変数とユーザー環境変数の両方で JAVA_HOME を設定していて競合 → どちらか片方に統一
  • IDE(IntelliJ / Eclipse)は独自に JDK を持つ → IDE 側の設定も必須

FAQ

Q: java -version は通るのに javac -version が無い
A: JRE のみがインストールされている状態です。JDK を入れて PATH と JAVA_HOME を JDK に向け直してください。

Q: JDK を入れても直らない
A: mvn -version の Java home が JRE のままなら、JAVA_HOME の値かシェルの再読み込み忘れの可能性。echo $JAVA_HOMEwhich javac を必ず確認してください。

Q: 複数バージョンを使い分けたい
A: Linux/Mac は SDKMAN!、Windows は jabba / scoop を使うと sdk use java 17 等で切替できます。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. java.lang.IllegalStateException: CGLIB is required to process @Configuration classes
  2. Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator
  3. No mapping found for HTTP request with URI ... in DispatcherServlet with name ...
  4. An internal error occurred during: "Building UI model". com/google/common/base/Function
  5. No identifier specified for entity : ...
  6. org.hibernate.hql.internal.ast.QuerySyntaxException: table_name is not mapped
  7. No compiler is provided in this environment
  8. java.sql.SQLException: The server time zone value ' ... ' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone
  9. Caused by: java.lang.RuntimeException: Executing an update/delete query
  10. Not supported for DML operations
  11. Field ... required a bean of type ... hat could not be found.
  12. Annotation-specified bean name ' ... ' for bean class [ ... ] conflicts with existing, non-compatible bean definition of same name and class [...]
  13. Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.
  14. Exception in thread "main" java.lang.UnsupportedClassVersionError