在我的机器上,我安装了两个 Java 版本:(我手动安装了 1.6 和 1.7)。我需要他们两个用于不同的项目。但是对于 Maven,我需要 1.7,但我的 Maven 使用 1.6 Java 版本。
如何将 Maven 设置为使用 1.7?
Maven 使用该JAVA_HOME
参数来查找它应该运行的 Java 版本。我从您的评论中看到您无法在配置中更改它。
JAVA_HOME
在启动 maven 之前设置参数(如果需要,可以在之后将其更改回来)。mvn
(non-windows)/ mvn.bat
/ mvn.cmd
(windows) 并在那里明确设置您的 java 版本。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 版本如何。
在 POM 中,您可以设置编译器属性,例如 1.8:
<project>
...
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
...
</project>
最近,在 Maven 工作了七年之后,我了解了 toolchains.xml。Maven 甚至已经记录并从 2.0.9 开始支持它 -工具链文档
因此,我在 ~/.m2/ 文件夹中添加了一个 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>/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>
它允许您定义 Maven 可以使用哪些不同的 JDK 来构建项目,而与 Maven 运行时使用的 JDK 无关。有点像在 IDE 中在项目级别定义 JDK 时。
在窗户上
如果您不想更改JAVA_HOME
系统变量中的变量。
编辑您的mvn.bat
文件并添加这样的一行
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre
这可以在@REM ==== START VALIDATION ====
@Jonathan 提到之后完成
在 Mac(和 Linux ?)
如果您不想更改您的JAVA_HOME
变量~/.bashrc
或~/.bash_profile
您可以创建一个~/.mavenrc
文件并JAVA_HOME
使用java_home 工具重新定义您的文件
export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_45`
完整性检查
您可以通过执行以下命令来验证一切是否正常。jdk版本应该不同。
mvn -version
然后
java -version
添加我的两分钱并明确提供解决方案。
我的 Windows 机器上安装了两个 JDK -JDK 1.5
和JDK 1.6
.
我的默认值(并设置为 windows 系统环境变量)JAVA_HOME
设置为JDK 1.5
.
但是,我有一个需要使用JDK 1.6
.
我在这种情况下的解决方案(有效!),正如@DanielBarbarian
将其设置在mvn.bat
.
对于一些不熟悉window的批处理文件的人,我基本上只是在(ie, )set JAVA_HOME=<path_to_other_jdk>
后面加了一行:@REM ==== START VALIDATION ====
mvn.bat
%MAVEN_HOME%\bin\mvn.bat
@REM ==== START VALIDATION ====
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45\jre
if not "%JAVA_HOME%" == "" goto OkJHome
您可以按照以下说明将 Maven 设置为使用任何 java 版本。
在您的机器链接中安装 jenv
通过在命令行中发出以下命令来检查机器中安装的可用 java 版本。
jenv 版本
您可以使用以下命令指定全局 Java 版本。
jenv 全局 oracle64-1.6.0.39
您可以在命令行的目录中使用以下命令为任何目录(项目)指定本地 Java 版本。
jenv 本地 oracle64-1.7.0.11
在 pom.xml 中添加正确的 java 版本
如果您在命令行中运行 maven,请使用以下命令安装jenv maven 插件
jenv 启用插件 Maven
现在您可以毫无问题地将您机器中的任何 java 版本配置到任何项目中。
一个简单的问题解决方案 -
JAVA_HOME=/usr/lib/jvm/java-6-sun/ mvn 全新安装
在 Mac 上,它看起来像 -
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/ mvn clean install
PS:我发现的一种特殊情况是上面给出的命令不适用于“鱼”外壳。我也有可用的 bash shell,它在那里工作得很好。只需使用命令“bash”切换到 bash shell。
在 Mac 上,(假设您安装了正确的版本)
JAVA_HOME=`/usr/libexec/java_home -v 1.8` mvn clean install -DskipTests
在 Windows 上,我只需将不同 JDK 版本的多个批处理文件添加到 Maven bin 文件夹中,如下所示:
mvn11.cmd
@echo off
setlocal
set "JAVA_HOME=path\to\jdk11"
set "path=%JAVA_HOME%;%path%"
mvn %*
然后就可以使用mvn11
指定的JDK来运行Maven了。
您可以使用不同的 JDK和maven-compiler-plugin
.
只需javac
在<executable>
标签中指定路径即可。例如对于 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>
我正在使用 Mac,上面的答案都没有帮助我。我发现 maven 从以下指定的路径加载自己的 JAVA_HOME:~/.mavenrc
我将文件的内容更改为:
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
对于 Linux,它看起来像:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre
在不更改环境变量的情况下,您可以使用 Maven Compiler Plugin 根据项目级别管理 java 版本。
方法一
<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>
方法二
<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>
为了避免对您的项目和环境变量产生任何影响,您可以将 Maven 编译器插件配置为项目的 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>
最近安装了 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" "$@"
仅在控制台中设置,我在 mac 上没有成功,JAVA_HOME
但我用这种方法成功了
~/.mavenrc
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
vi ~/.bash_profile
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
运行source ~/.bash_profile
以使其永远工作
之后,您可以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 的应用程序使用JAVA_HOME来定义 Java 运行时环境 (JRE) 的安装位置。 M2_HOME由Maven使用,它再次告诉程序在哪里找到 Maven 安装。
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre
添加上面的代码行作为第一条语句$MAVEN_HOME\bin\mvn.cmd
在 Windows 10 中立即为我工作。
我正在使用 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
您也可以安装两个版本的 maven,然后编辑其中一个,在此处编辑:
mvn(非windows)/mvn.bat/mvn.cmd(windows)
将您的 %java_home% 外观替换为您的 java 所需路径。然后从修改后的路径执行 maven
您只需在调用 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 :)
我使用了@Jonathan 的基本想法。我已经设置了窗口: set JAVA_HOME=C:\Program Files\java\AdoptOpenJDK-11.0.8+10 call mvn clean package -DskipTests