带有模块信息的旧项目

对于希望兼容旧版本Java(即1.8或以下)的项目,又想为Java 9项目提供module-info.java,必须知道他们需要调用javac两次:module-info。 java必须使用release=9编译,而其余源必须使用较低版本的source / target编译。

执行此操作的首选方法是使用 2 个执行块,如下所述。JDK 9 只支持对 Java 6 及以上版本的编译,因此想要兼容 Java 5 或以下版本的项目需要使用两个不同的 JDK。使用工具链很容易实现这一点。请注意,您至少需要 Maven 3.3.1 才能在插件配置中指定自定义 jdkToolchain。您可以添加一个 jdkToolchain 来执行基本编译执行块以及参考 JDK 5。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <configuration>
              <!-- compile everything to ensure module-info contains right entries -->
              <!-- required when JAVA_HOME is JDK 8 or below -->
              <jdkToolchain>
                <version>9</version>
              </jdkToolchain>
              <release>9</release>
            </configuration>
          </execution>
          <execution>
            <id>base-compile</id>
            <goals>
              <goal>compile</goal>
            </goals>
            <!-- recompile everything for target VM except the module-info.java -->
            <configuration>
              <excludes>
                <exclude>module-info.java</exclude>
              </excludes>
            </configuration>
          </execution>
        </executions>
        <!-- defaults for compile and testCompile -->
        <configuration>
          <!-- jdkToolchain required when JAVA_HOME is JDK 9 or above -->
          <jdkToolchain>
            <version>[1.5,9)</version>
          </jdkToolchain>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

如果您希望项目与 Java 6 兼容,最简单的方法是将 Java 9 用于两个执行块。您可以使用 maven-toolchain-plugin 指定共享 JDK(自 Maven 2.0.9 起支持)或自定义 jdkToolchain(自 Maven 3.3.1 起支持)并参考您系统上的 JDK 9 安装。或者通过设置JAVA_HOME=/path/to/jdk-9简单地使用 Java 9 作为 Maven 的运行时。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <configuration>
              <!-- compile everything to ensure module-info contains right entries -->
              <release>9</release>
            </configuration>
          </execution>
          <execution>
            <id>base-compile</id>
            <goals>
              <goal>compile</goal>
            </goals>
            <!-- recompile everything for target VM except the module-info.java -->
            <configuration>
              <excludes>
                <exclude>module-info.java</exclude>
              </excludes>
            </configuration>
          </execution>
        </executions>
        <!-- defaults for compile and testCompile -->
        <configuration>
          <!-- Only required when JAVA_HOME isn't at least Java 9 and when haven't configured the maven-toolchains-plugin -->
          <jdkToolchain>
            <version>9</version>
          </jdkToolchain>
          <release>6</release>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>