プログラミング

実装・エラー解決

Eclipseで「動的 Web モジュール 3.1 は Java 1.7 またはそれ以降 を要求します」が解消されない時の対応

事象

Eclipseで「動的 Web モジュール 3.1 は Java 1.7 またはそれ以降を要求します」と表示されました。Javaファセットを11にしても、Mavenのプロジェクト更新でJavaの設定が古い値に戻る状況です。

環境

当時はEclipse 2019-12、Maven、Java 11を使用しました。以下のPOM例はJDK 17とMavenでコンパイル対象をJava 11に揃える例です。

詳細

Eclipse側でファセットを変更しても、Mavenプロジェクトを再同期するとPOM側のJava設定が使われることがあります。mvn -v で実行JDK、mvn help:effective-pom で有効なコンパイル設定を確認してから、EclipseのJREとファセットを見ます。

対応

Mavenにてコンパイルに使用するJavaのバージョンを明記する。

下のPOMではコンパイル対象を11にしています。既存POMへ反映するときは、親POM・プロファイル・プラグインで設定が重ならないかを確認してください。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>example</groupId>
  <artifactId>maven-eclipse-java11-sample</artifactId>
  <version>1.0</version>
  <properties>
    <maven.compiler.release>11</maven.compiler.release>
  </properties>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.14.1</version>
      </plugin>
    </plugins>
  </build>
</project>
public class Demo {
    public static void main(String[] args) {
        System.out.println("compiler target ok");
    }
}
mvn clean compile
javap -verbose -classpath target/classes Demo
# major version: 55

Mavenで通った後、Eclipseで「Maven → プロジェクトの更新」を行い、JREシステムライブラリーとJavaファセットが11を指すことを確認します。Eclipseが対象プロジェクトで使えるJDKを認識していることも確認してください。

-実装・エラー解決
-,