如何将特定Java版本设置为Maven?

在我的机器上,我安装了两个Java版本:(1.6和1.7由我手动安装)。我在不同的项目中都需要他们。但对于Maven,我需要1.7,但我的Maven使用1.6 Java版本。

如何将Maven设置为使用1.7?

472765 次浏览

Maven使用JAVA_HOME参数来查找它应该运行的Java版本。我从你的评论中看到,你不能在配置中改变它。

  • 您可以在启动maven之前设置JAVA_HOME参数(如果需要,可以在启动maven之后将其更改回来)。
  • 你也可以进入你的mvn(非windows)/mvn.bat/mvn.cmd(windows)并在那里显式地设置你的java版本。

加上我的意见,并明确地提供解决方案。

我的Windows机器上安装了两个jdk——JDK 1.5JDK 1.6

我的默认(并设置为windows系统环境变量)JAVA_HOME被设置为JDK 1.5

然而,我有一个maven项目,我需要使用JDK 1.6构建(即JBehave教程的Etsy.com)。

我在这个场景中的解决方案(它工作了!),是由@DanielBarbarian建议在mvn.bat中设置它。

对于一些不熟悉window的批处理文件,我基本上只是在mvn.bat中的@REM ==== START VALIDATION ====(即%MAVEN_HOME%\bin\mvn.bat)后面添加了set JAVA_HOME=<path_to_other_jdk>行:

@REM ==== START VALIDATION ====
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45\jre
if not "%JAVA_HOME%" == "" goto OkJHome

在windows上

如果你不想在系统变量中改变你的JAVA_HOME变量。

编辑你的mvn.bat文件并像这样添加一行

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre

这可以在@Jonathan提到的@REM ==== START VALIDATION ====之后完成

在Mac (&Linux ?)

如果你不想在你的~/.bashrc~/.bash_profile中改变你的JAVA_HOME变量

你可以创建一个~/.mavenrc文件并使用java_home工具重新定义你的JAVA_HOME

export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_45`

完整性检查

您可以通过执行以下命令来验证一切是否正常工作。jdk版本应该不同。

mvn -version

然后

java -version

在使用Maven长达7年之后,我最近才学会了toolchains.xml。Maven甚至已经对它进行了文档化,并从2.0.9 - 工具链的文档开始支持它

所以我在~/中添加了toolchains.xml文件。M2 /文件夹,内容如下:

<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
<!-- JDK toolchains -->
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>/opt/java8</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.7</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>/opt/java7</jdkHome>
</configuration>
</toolchain>
</toolchains>

它允许您定义可以使用哪些不同的JDK Maven来构建项目,而不管JDK Maven使用什么运行。有点像在IDE中在项目级别上定义JDK。

为了避免对项目和环境变量的任何影响,您可以将Maven Compiler Plugin配置为项目的POM,指定源和目标java版本

  <plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
...
</plugins>

解决这个问题的一个简单办法就是

JAVA_HOME=/usr/lib/jvm/java-6-sun/ mvn clean install

在Mac上,它看起来像-

JAVA_HOME = /图书馆/ Java / JavaVirtualMachines / jdk1.7.0_21。jdk/Contents/Home/ mvn clean install

PS:我发现的一个特殊情况是,上面给出的命令对'fish' shell不起作用。我也有bash shell可用,它在那里工作得很好。只需使用命令'bash'切换到bash shell。

在POM中,你可以设置编译器属性,例如1.8:

<project>
...
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
...
</project>

编辑:

Ondrej的答案提供了一个更好的解决方案,它避免了记住别名。


最初的回答:

为安装了多个Java版本的用户添加解决方案

我们有一个很大的代码库,其中大部分是Java。我所做的大部分工作都是用Java 1.7或1.8编写的。由于JAVA_HOME是静态的,我在我的.bashrc中创建了不同值的别名来运行Maven:

alias mvn5="JAVA_HOME=/usr/local/java5 && mvn"
alias mvn6="JAVA_HOME=/usr/local/java6 && mvn"
alias mvn7="JAVA_HOME=/usr/local/java7 && mvn"
alias mvn8="JAVA_HOME=/usr/local/java8 && mvn"

这让我可以在我的开发机器上从命令行运行Maven,而不管项目上使用的JDK版本是什么。

在Linux/Unix上,“mvn”shell脚本中的JAVA_HOME会被中的设置覆盖

$HOME/.mavenrc

在哪里添加JAVA_HOME和MAVEN路径变量在linux

你也可以安装maven的两个版本,并编辑它们的一个版本,编辑在这里:

mvn(非windows) / mvn.bat mvn.cmd (windows)

将您的%java_home%外观替换为您的Java所需路径。然后从修改后的路径执行maven

我在mac上没有成功,只是在控制台设置JAVA_HOME,但我成功地使用了这种方法

  • 在你的主目录中创建. maavenrc文件(因此文件的路径将是~/.mavenrc
  • export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)粘贴到该文件中

你可以用maven-compiler-plugin来配置使用不同的JDK编译源代码

只需在<executable>标记中指定javac的路径。例如,对于java11,它看起来像:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source>
<target>11</target>
<fork>true</fork>
<executable>C:\Program Files\Java\jdk-11.0.1\bin\javac</executable> <!--PATH TO JAVAC -->
</configuration>
</plugin>

您可以按照下面的说明将Maven设置为使用任何java版本。

在你的机器链接中安装jenv

通过在命令行中发出以下命令,检查机器中安装的可用java版本。

jenv版本

可以使用以下命令指定全局Java版本。

Jenv global oracle64-1.6.0.39

您可以在命令行中的目录中使用以下命令为任何目录(项目)指定本地Java版本。

Jenv local oracle64-1.7.0.11

在pom.xml中添加正确的Java版本

如果你在命令行中运行maven,使用下面的命令安装Jenv maven插件

Jenv使能插件maven

现在,您可以在您的机器上为任何项目配置任何java版本,而不会遇到任何麻烦。

在windows中,我只是将不同JDK版本的多个批处理文件添加到Maven bin文件夹中,如下所示:

mvn11.cmd

@echo off
setlocal
set "JAVA_HOME=path\to\jdk11"
set "path=%JAVA_HOME%;%path%"
mvn %*

那么你可以使用mvn11在指定的JDK中运行Maven。

在mac上(假设你安装了正确的版本)

JAVA_HOME=`/usr/libexec/java_home -v 1.8` mvn clean install -DskipTests

在不改变环境变量的情况下,您可以使用Maven Compiler Plugin基于项目级别管理java版本。

方法1

<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

方法2

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
我使用了@Jonathan的基本想法。 我设置了窗口:set JAVA_HOME=C:\Program Files\java\AdoptOpenJDK-11.0.8+10 调用mvn clean package -DskipTests

最近安装了Java10,看看它有什么新的和有趣的。一旦我这样做了,并尝试运行现有的项目使用java8。 令我惊讶的是,maven开始使用java10作为它的默认java版本,尽管我的JAVA_HOME设置为使用java8 — /usr/libexec/java_home -v 1.8

鉴于,我的安装是使用brew完成的- brew只是Mac OS的包管理器,我的M2_HOME是自动设置的。这通常在/usr/local/Cellar/maven/3.5.4

带着这个新发现的知识,我跑了

nano /usr/local/Cellar/maven/3.5.4/bin/mvn

内容是

#!/bin/bash
JAVA_HOME="${JAVA_HOME:-$(/usr/libexec/java_home)}" exec "/usr/local/Cellar/maven/3.5.4/libexec/bin/mvn" "$@"

重要的位

"${JAVA_HOME:-$(/usr/libexec/java_home)}"

要解决这个问题,需要指定maven默认使用的java版本。所以在我的例子中,我需要java8。

按如下方式更新/usr/local/Cellar/maven/3.5.4/bin/mvn文件

#!/bin/bash
JAVA_HOME="${JAVA_HOME:-$(/usr/libexec/java_home -v 1.8)}" exec "/usr/local/Cellar/maven/3.5.4/libexec/bin/mvn" "$@"

我正在使用jenv,并面临“javax.xml.bind.annotation”的编译错误。由于终端中的MVN使用的是openjdk 13

Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 13.0.2, vendor: N/A, runtime: /usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home


对我来说,它在运行'jenv enable-plugin maven'后工作,就像这里建议的那样 https://stackoverflow.com/a/56487374/1582473 < / p >

  1. 在终端vi ~/.bash_profile
  2. 之后,将下面的路径粘贴到基本配置文件中,并通过vim命令wq!保存它
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
export M2_HOME=/Users/mj/Tools/apache-maven-3.8.1
  1. 运行source ~/.bash_profile使它永远工作

  2. 之后,你可以在你的终端上运行mvn -v来检查

Maven home: /Users/mj/Tools/apache-maven-3.8.1
Java version: 1.8.0_211, vendor: Oracle Corporation,
runtime: /Users/mj/Tools/jdk1.8.0_211.jdk/Contents/Home/jre
Default locale: en_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"

如果你想知道原因,请阅读下面的内容

JAVA_HOME是使用由许多基于Java的应用程序定义Java运行时环境(JRE)的安装位置。 M2_HOME是Maven的使用,它再次告诉程序在哪里找到Maven安装。

我正在使用Mac,上面的答案对我没有任何帮助。我发现maven从:~/.mavenrc中指定的路径加载自己的JAVA_HOME

我将文件的内容更改为:

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home

对于Linux,它看起来像这样:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre
你只需要在调用JAVA_HOME之前将你的JAVA版本添加到mvn文件中 例如,我的。bashrc文件中的JAVA版本是JAVA -17 我想用Java-11运行maven:

在文件/usr/share/maven/bin/mvn: 我添加:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

在脚本中调用JAVA_HOME之前

然后它在Java-11中工作得很好:)

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre

将上述代码行作为$MAVEN_HOME\bin\mvn.cmd中的第一个语句添加到Windows 10中,我马上就工作了。

用上面的答案我无法解决这个问题,我尝试了很多方法来解决这个问题,我得到了它。我希望像我这样的人能解决这个问题。

我正在使用brew安装java和maven。 对我来说,我想使用java 1.8。所以我安装了java 1.8 但仍然maven使用版本17.0.2

解决方案:
安装Java 1.8 我参考这个网站来安装它:https://devqa.io/brew-install-java/

mvn --version和记住版本\

cat /usr/local/Cellar/maven/VERSION(for me 3.8.5)/bin/mvn

然后你会看到

#!/bin/bash
JAVA_HOME="${JAVA_HOME:-/usr/local/opt/openjdk/libexec/openjdk.jdk/Contents/Home}" exec "/usr/local/Cellar/maven/3.8.5/libexec/bin/mvn"  "$@"\

检查这个目录

ls /usr/local/opt

您将看到openjdk、openjdk@17、openjdk@8等文件

在MVN文件中将openjdk目录更改为openjdk@8:

#!/bin/bash
JAVA_HOME="${JAVA_HOME:-/usr/local/opt/openjdk@8/libexec/openjdk.jdk/Contents/Home}" exec "/usr/local/Cellar/maven/3.8.5/libexec/bin/mvn"  "$@"\

Ondrej的回答 完美的工作。它真正解决了问题。尽管工具链的文档

中详细描述了一些其他的事情要做
  1. 在项目POM中添加maven-toolchains-plugin
  2. 配置maven-toolchains-plugin以使用toolchains.xml文件中配置的工具链中的特定JDK。

请看下面的配置示例:

toolchains.xml

<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
<!-- JDK toolchains -->
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>17</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk-11.0.12.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
</toolchains>

如上所示,这适用于安装了多个java版本的机器。 然后在项目的POM中,maven-toolchains-plugin被配置为使用定义为工具链的JDK版本之一

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>11</version>
<vendor>sun</vendor>
</jdk>
</toolchains>
</configuration>
</plugin>
< p > Mac用户, 如果您已经从HomeBrew(Brew)安装了maven, 或者即使你是从别处安装的, 如果您想更改Maven使用的Java的默认版本, 您可以使用以下命令来更改maven使用的版本,

vim ~/.mavenrc

在弹出的gui中输入这个并保存-

JAVA_HOME="(put the Home path of your desired java version package)"

要验证maven的路径是否已更改,可以使用-进行检查

mvn -v

设置Java默认版本 您的系统上可能有两个不同版本的Java。使用

命令将其设置为默认值

Sudo选项——配置Java

系统显示不同Java版本的列表。如果您喜欢默认设置,请按Enter。

如果您想更改它,输入您想要的版本号,然后按Enter。