指定 Maven 使用的 JDK

我正在尝试构建一个我修改过的 Hudson 插件,它需要 jdk1.6。没关系,但我不知道该怎么告诉 Maven 另一个 JDK 在哪。我在互联网上发现很少有人提到我,但似乎并不适用于我。有人建议在 .m2/settings.xml中添加一些配置,但是我没有 settings.xml。另外,我不想对所有的 Maven 版本都使用1.6。

一个问题是我在 Cygwin 中使用的是 mvn,如果这还有意义的话。看起来我应该能够在项目 pom 文件中制定规范,但是现有的 pom 非常空白。

所以底线是,有没有一种方法可以为单个的 maven 调用指定一个 jdk?

361402 次浏览

所以底线是,有没有一种方法可以为单个的 maven 调用指定一个 jdk?

暂时改变你的 JAVA_HOME环境变量的值。

Hudson 还允许您定义几个 Java 运行时,并允许您使用其中一个运行时调用 Maven。仔细查看配置页面。

我建议你像帕斯卡说的那样设置环境变量: 在 Cygwin,如果使用 bash 作为 shell,应该是:

export JAVA_HOME=/cygdrive/c/pathtothejdk

也可以使用下面的方法将 java/bin目录路径传递到 PATH环境变量:

export PATH=${JAVA_HOME}/bin:${PATH}

还要添加 maven-enforce-plugin以确保使用了正确的 JDK。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-versions</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireJavaVersion>
<version>1.6</version>
</requireJavaVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

请看 Maven Enforcer 插件-使用方法

正如您所说的“另外,我不想对所有的 maven 构建都使用1.6”所以我会更好地说,修改您的 pom 文件,并指定使用哪个 jdk 版本。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.9</source>
<target>1.9</target>
</configuration>
</plugin>
</plugins>
</build>

它将确保您的特定项目使用该版本的 jdk。

Maven 使用变量 $JAVACMD 作为最终的 java 命令,将其设置为 java 可执行文件将在哪里切换到不同的 JDK。

看来 Maven 现在给出了一个解决方案: 使用不同的 JDK 编译源代码

假设您的 JAVA_HOME指向 JDK7(它将运行 maven 进程)

你的 pom.xml可以是:

<build>
<plugins>
<!-- we want JDK 1.6 source and binary compatiblility -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- ... -->
<!-- we want sources to be processed by a specific 1.6 javac -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable>${JAVA_1_6_HOME}/bin/javac</executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>

如果您的开发人员只是在他们的 settings.xml中添加(并自定义)以下代码行,那么您的 POM 将与平台无关:

<settings>
[...]
<profiles>
[...]
<profile>
<id>compiler</id>
<properties>
<JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
<JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
</properties>
</profile>
</profiles>
[...]
<activeProfiles>
<activeProfile>compiler</activeProfile>
</activeProfiles>
</settings>

我在 Windows7的 Eclipse 中构建 maven 时遇到了问题。

虽然我观察到 mvn build 从命令行运行得很好。

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml   > output.log

Eclipse 考虑将 JRE 安装作为默认的 JVM,而不是 JDK,因此它在编译时失败了。

我在 eclipse.ini 中添加了以下内容:

-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin

另外,当从 eclipse 开始时,我在“目标”部分使用了以下列表:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml

解决了编译错误。

编译: 编译 has 用户属性,它允许您指定到 javac的路径。

请注意,此用户属性仅在 forktrue时有效,而 true在默认情况下为 false

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile

如果该值包含空格,则可能必须双引号。

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile

参见 Maven 自定义属性优先级

我知道这是条老线索。但是我在 MavenforJava8编译器源代码中遇到了一些类似的问题。我想我可以把它放在这里,也许可以帮助其他人:

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

对于 Java 9:

<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>

另一种管理多个 jdk 版本的方法是 JEnv

安装完成后,您可以简单地更改 java 版本“本地”,例如,对于特定的项目目录,通过以下方法:

jenv local 1.6

当您启用 mvn 插件时,这也将使 mvn 在本地使用该版本:

jenv enable-plugin maven

您还可以在主目录 ~/.mavenrc中的一个文件中为 Maven 设置 JDK:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

这个环境变量将由 mvn 脚本检查,并在下列情况下使用:

  if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi

Https://github.com/codefx-org/mvn-java-9/tree/master/mavenrc

如果你已经在 Mac中通过 brew安装了 Java,那么你可能会在这里找到你的 Java 主目录:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

现在的下一步是查找 maven 指向的 Java Home目录。要找到它,请在命令中键入:
mvn -version

enter image description here

我们感兴趣的领域是: Java versionruntime

Maven 目前指向 Java 13。另外,您可以看到 Java Home 路径在键运行时下面,这是:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

要更改 maven 的 Java 版本,我们需要将 Java 8主路径添加到 JAVA_HOME env 变量。

为此,我们需要运行以下命令:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 在航站楼里。

现在如果我们检查 maven 版本,我们可以看到它现在指向 Java8。

enter image description here

这样做的问题是,如果您在新终端中再次检查 maven 版本,您将发现它指向 Java13。为了避免这种情况,我建议在 ~/.profile文件中添加 JAVA_HOME变量。

这样,无论何时加载终端,它都会默认使用在 JAVA _ HOME 中定义的值。这是您需要在 ~/.profile文件中添加的代码行:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

您可以打开一个新的终端并检查 Maven 版本(mvn -version) ,这次您会发现它指向 Java8。

如果没有其他工作,甚至在将 JAVA _ HOME 设置为 正确路径之后,检查是否没有覆盖 <user>/.mavenrc中的 JAVA _ HOME 路径!

作为进一步的提示,mvn文件是一个 bash 脚本(在 Linux 上)。.所以如果需要的话,你可以检查源代码[并修改它]。

我更新了我的 ~/. m2/setings.xml

<settings>
<profiles>
<profile>
<id>j8</id>
<profile>
<id>j8</id>
<properties>
<maven.compiler.fork>true</maven.compiler.fork>
<maven.compiler.executable>${env.JAVA_HOME8}/bin/javac.exe</maven.compiler.executable>
</properties>
</profile>
<profile>
<id>j11</id>
<properties>
<maven.compiler.fork>true</maven.compiler.fork>
<maven.compiler.executable>${env.JAVA_HOME11}/bin/javac.exe</maven.compiler.executable>
</properties>
</profile>
</profiles>
<settings>

对于使用 Java8构建,我使用属性运行 mvn:

mvn compile -Pj8

以及 Java11

mvn compile -Pj11