如何在 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
我在一个环境中工作,应用程序使用不同的 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