如何在 Maven 中使用给定的 JDK 强制编译

How to enforce compilation with a given JDK in Maven

我在一个环境中工作,应用程序使用不同的 Java 版本:7、8 和更高版本。 开发人员因此安装了几个 JDK,每个 Maven pom.xml 确实有正确的 <source><target> 标签。但是,有时开发人员会无意中使用更高的 JDK 进行编译。因此,它们可能会在 Java 7 中包含一个 Java 8 class,例如 java.time.LocalDate,因为它能够在编译时解析导入。但是当应用程序稍后移动到 JRE 7 上的 运行 时,它将失败,因为它无法找到 Java 8 class。 可以在 pom.xml 中创建配置文件,例如:

<profile>
  <id>compiler</id>
    <properties>
      <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
    </properties>
</profile>

但是,JDK 的位置因开发人员而异,我想要一个每个人都通用的 pom.xml。

所以问题是,如何强制 Maven 使用给定的 JDK 版本? 不仅是 <source><target>,而且JDK 本身并以通用方式不绑定到任何给定计算机。

最初我以为maven-compiler-plugin设置source/target为1.7就足以编译失败,但如果你安装了JDK 8,编译成功(奇怪!)。

你真正需要的是maven-enforcer-plugin。看下面的配置,我把它放在 validate 阶段的 运行,就在 compile:

之前
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>3.0.0-M3</version>
            <executions>
                <execution>
                    <id>default-cli</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                    <configuration>
                        <rules>
                            <requireJavaVersion>
                                <version>[1.7,1.8)</version>
                            </requireJavaVersion>
                        </rules>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

输出:

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ compiler-demo ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Detected JDK Version: 1.8.0-152 is not in the allowed range [1.7,1.8).

您甚至可以设置自定义消息,让您的同事更清楚,例如

<rules>
  <requireJavaVersion>
    <version>[1.7,1.8)</version>
    <message>Project requires JDK 7</message>
  </requireJavaVersion>
</rules>

输出:

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ compiler-demo ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Project requires JDK 7

只是为了探索插件的功能,我尝试看看它是否支持多个版本范围。它确实(运行 a JDK 11 试试看):

<requireJavaVersion>
    <version>[1.7,1.8),[9,10)</version>
</requireJavaVersion>

输出:

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ compiler-demo ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
Detected JDK Version: 11.0.1 is not in the allowed range [1.7,1.8),[9,10).
export JAVA_HOME=..... && mvn clean compile

这应该确保您使用的是正确的 JDK