【问题标题】:How to set specific Java version to Maven?如何将特定的 Java 版本设置为 Maven?
【发布时间】:2013-11-08 09:24:09
【问题描述】:

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

如何将 Maven 设置为使用 1.7?

【问题讨论】:

  • 我无法使用 java 1.7 导出 JAVA_HOME,因为我无法触摸我的机器的配置,Java 的默认版本必须是 1.6。
  • Maven 使用 JAVA_HOME 所以不要认为你想做的事不改变 JAVA_HOME 值是可能的。
  • 您使用的是 IDE 还是命令行?你是在 *nix 还是 windows 上?
  • 这个答案是否涵盖了您想要的内容? stackoverflow.com/a/4724062/1570834
  • 是的很有用,但我不能对项目的 pom 进行更改,但是东西是一样的,答案是正确的

标签: java maven java-7 java-6


【解决方案1】:

Maven 使用JAVA_HOME 参数来查找它应该运行的Java 版本。我从您的评论中看到您无法在配置中更改它。

  • 您可以在启动 maven 之前设置JAVA_HOME 参数(如果需要,可以在之后将其更改回来)。
  • 您也可以进入 mvn(non-windows)/mvn.bat/mvn.cmd(windows) 并在此处明确设置您的 java 版本。

【讨论】:

  • @andPat:所以?您可以在本地 shell 中设置JAVA_HOME,而无需更改机器的配置(一旦关闭该 shell,更改就消失了)。您甚至可以将其更改为单个命令:JAVA_HOME=/path/to/jdk17/ mvn build
  • @JoachimSauer:是的,但我也提到了 mvn.bat,它是 Windows 特定的。
  • 在mac上你可以创建一个.mavenrc文件,里面有JAVA_HOME
  • 旧的,但投入了我的 2cents。我正在开发由 Java 7 应用程序调用的 Java 8 服务。为了避免在构建时必须不断切换,我(在 Windows 上)创建了一个 MVN_JAVA_HOME 环境变量,然后在 mvn 和 mvn.cmd 中将每次出现的 JAVA_HOME 替换为 MVN_JAVA_HOME。
【解决方案2】:

编辑:

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 版本如何。

【讨论】:

  • 除非您需要 maven 2 和 3 用于各种项目,在这种情况下,您已经定义了 mvn2mvn3,并且当 Java 版本也开始发挥作用时,命名变得有点时髦...... :D
  • 如果您使用的是 Mac,您的 JDK 带有 java_home 命令,因此您可以避免硬编码路径,例如alias mvn8 = "JAVA_HOME=`/usr/libexec/java_home -v 1.8` && mvn
  • 在 (ubuntu + bash) 上,您必须在 mvn 之前省略 &&。 mvn 没有看到带有&& 的 JAVA_HOME 的值。
  • @acabra85 从 Ondrej 那里看到这个更好的答案:stackoverflow.com/a/35463606/2386514
  • 我不认为工具链的答案总是更好。它需要摆弄项目 pom,如果您有很多和/或复杂的 maven 项目,您可能不想这样做。这无需触摸 poms 即可实现相同的效果。
【解决方案3】:

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

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

【讨论】:

  • 从编译器插件版本 3.7.0 开始,如果未指定,源和目标的默认值为 1.5
  • 这些版本可以使用版本 9、10 11 而不是 1.X 吗?
  • 不知何故,使用 Java 15 和 Maven 3.6.0,当我尝试编译 Java 8 项目时,即使添加了您提到的属性,我也会收到 package javax.xml.bind.annotation does not exist 错误。如果我将JAVA_HOME 设置为java8 文件夹,mvn 将再次正常工作。
【解决方案4】:

在窗户上

如果您不想更改系统变量中的JAVA_HOME 变量。

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

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

这可以在@REM ==== START VALIDATION ==== 之后完成,就像@Jonathan 提到的那样

在 Mac(和 Linux ?)上

如果您不想更改 ~/.bashrc~/.bash_profile 中的 JAVA_HOME 变量

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

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

健全性检查

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

mvn -version

然后

java -version

【讨论】:

  • 我设置为设置 JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45 排除 jre 子文件夹。
  • 是的,@nanosoft 这仅适用于将 JAVA_HOME 设置为 JDK 目录,而不是带有 \jre 的 JRE。
【解决方案5】:

最近,在 Maven 工作了七年之后,我了解了 toolchains.xml。 Maven 甚至记录并支持它,从 2.0.9 - toolchains documentation

所以我在 ~/.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 运行时/框架运行 Maven 和正在编译的项目。
  • 这是页面上最好的解决方案,应该是公认的答案。
  • 这个配置如何在每个项目的 pom.xml 中工作?在 pom.xml 中定义 '1.8' 意味着使用 /opt/java8?
  • 这是最好的答案,应该是公认的答案。工具链就是为这种情况而设计的。
  • 加入 - 最佳答案!还有,谢谢。我也已经使用 maven 十多年了,从来不知道工具链!干杯
【解决方案6】:

加上我的两分钱并明确提供解决方案。

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

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

但是,我有一个需要使用 JDK 1.6 构建的 maven 项目(即 JBehave Tutorial's Etsy.com)。

我在这种情况下的解决方案(有效!),正如@DanielBarbarian 所建议的那样,将其设置为mvn.bat

对于一些不熟悉window的批处理文件的人,我基本上只是在mvn.bat中的@REM ==== START VALIDATION ====之后添加了set JAVA_HOME=&lt;path_to_other_jdk&gt;这一行(即%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 3.5 中,mvn.bat 被重命名为 mvn.cmd
【解决方案7】:

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

在你的机器上安装 jenv link

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

jenv 版本

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

jenv 全局 oracle64-1.6.0.39

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

jenv 本地 oracle64-1.7.0.11

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

如果您在命令行中运行 maven,请使用以下命令安装 jenv maven 插件

jenv enable-plugin maven

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

【讨论】:

  • 喜欢这个选项。 jenv 就像 python 的 virtualenv
【解决方案8】:

解决问题的一个简单方法 -

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:我发现的一种特殊情况是上面给出的命令不适用于“fish”shell。我也有可用的 bash shell,它在那里工作得很好。只需使用命令 'bash' 切换到 bash shell。

【讨论】:

    【解决方案9】:

    在 Mac 上,(假设您安装了正确的版本)

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

    【讨论】:

      【解决方案10】:

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

      mvn11.cmd

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

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

      【讨论】:

      • 这更干净,因为我们知道我们运行的是什么版本!
      • 设置路径,你应该使用bin子文件夹:set "path=%JAVA_HOME%\bin;%path%"
      【解决方案11】:

      您可以将compiling sources using different JDK 配置为maven-compiler-plugin

      只需在&lt;executable&gt; 标签中指定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>
      

      【讨论】:

        【解决方案12】:

        在不改变环境变量的情况下,您可以使用 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>
        

        【讨论】:

          【解决方案13】:

          为避免对您的项目和环境变量产生任何影响,您可以将 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>
          

          【讨论】:

            【解决方案14】:

            我使用的是 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
            

            【讨论】:

              【解决方案15】:

              最近安装了 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" "$@"
              

              【讨论】:

              • 请在发布您的答案时使用代码格式。
              • 检查可执行逻辑的好方法,幸运的是它是一个 bash 脚本。在我的情况下,它会检查 JAVA_HOME,如果不存在将对which java 感到满意。 which java 将我指向/usr/bin/java,即/etc/alternatives/java,并将在安装新版本时更新。
              【解决方案16】:

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

              $HOME/.mavenrc
              

              Where to add JAVA_HOME and MAVEN path variables in linux

              【讨论】:

                【解决方案17】:

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

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

                【讨论】:

                  【解决方案18】:
                  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 安装。

                  【讨论】:

                  • 嗯,这是真的,也是假的。你可以设置它,它可能会工作,但实际上它可以为空,你仍然可以使用 Maven,它只是选择你安装的最新版本,至少在我的 Ubuntu 中是这样。 (echo $JAVA_HOME 是空的),正如@new coder 所说。
                  【解决方案19】:

                  您还可以安装 两个 版本的 maven,然后编辑其中的 一个,在此处进行编辑:

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

                  将您的 %java_home% 外观替换为您想要的 java 路径。然后从修改后的路径执行 maven

                  【讨论】:

                    【解决方案20】:

                    我使用了@Jonathan 的基本想法。 我已经设置了窗口: set JAVA_HOME=C:\Program Files\java\AdoptOpenJDK-11.0.8+10 调用 mvn clean package -DskipTests

                    【讨论】:

                      【解决方案21】:

                      我正在使用 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

                      【讨论】:

                        【解决方案22】:

                        您只需在调用 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 上正常工作:)

                        【讨论】:

                          【解决方案23】:
                          set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre
                          

                          将上述代码行添加为$MAVEN_HOME\bin\mvn.cmd 中的第一条语句在 Windows 10 中立即为我工作。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-11-12
                            • 2020-04-12
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-09-13
                            • 1970-01-01
                            • 2018-05-18
                            相关资源
                            最近更新 更多