【问题标题】:Specify JDK for Maven to use指定 JDK 供 Maven 使用
【发布时间】:2011-01-31 00:17:44
【问题描述】:

我正在尝试构建一个我修改过的 Hudson 插件,它需要 jdk1.6。这很好,但我不知道如何告诉 maven 不同的 jdk 在哪里。我在互联网上发现很少提及,但它们似乎不适用于我。有人建议向.m2/settings.xml 添加一些配置,但我没有settings.xml。另外,我不想将 1.6 用于所有 maven 构建。

一个问题是我在 cygwin 中使用 mvn,如果这很重要的话。看来我应该能够在项目 pom 文件中制定规范,但现有的 pom 非常简单。

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

【问题讨论】:

标签: maven-2 settings java pom.xml


【解决方案1】:

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

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

【讨论】:

  • Windows 中的示例:set JAVA_HOME="C:\Java\jdk7"
  • 在 lubuntu 中:JAVA_HOME="/home/desa/programas/jdks/jdk1.6.0_45/" mvn -v
  • 如果其他人忘记并花费很长时间想知道为什么他们不能更改它:JAVA_HOME 可以在此文件中为 Maven(至少在 Mac 上)设置:/private/etc/mavenrc - 那可以使用类似的东西(注意反引号不是单引号!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
  • Unix:export JAVA_HOME='D:/dev/java/jdk8/jre'(对我有用)
  • 如果我更改了 JAVA_HOME 然后我更改了java -version,它仍然会打印以前的版本。
【解决方案2】:

似乎 maven 现在在这里给出了解决方案:Compiling Sources Using A Different 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>

【讨论】:

  • 投了赞成票!我发现我可以在命令行中使用-Dmaven.compiler.fork=true-Dmaven.compiler.executable=/path/to/target/javac
  • 即使使用那些 java-opts,您仍然必须将其添加到编译器插件 ${maven.compiler.executable}
  • @JinKwon 使用 -D 传递选项可以正常工作,即使没有在编译器插件部分定义它。这非常适合偶尔使用或编写脚本。你应该把它放在一个单独的答案中,这样我们就可以投票了!
  • 当我尝试在 Java 8 中运行测试时,这个解决方案失败了,我得到 *Unsupported major.minor version 52.0 *
【解决方案3】:

compile:compile 具有a user property,允许您指定javac 的路径。

请注意,此用户属性仅在 forktrue(默认为 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 custom properties precedence

【讨论】:

  • 我还需要覆盖我的 JAVA_HOME 变量。例如(在 bash shell 中):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
【解决方案4】:

正如你所说的“另外,我不想为所有 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 编译器插件为 1.7 编译的要求。然后诀窍是让 maven 真正能够为 1.7 编译,如果您当前的 java 版本不同,这并不是那么简单......
【解决方案5】:

我说你设置了 JAVA_HOME 环境变量,就像 Pascal 说的那样: 在 Cygwin 中,如果你使用 bash 作为你的 shell 应该是:

export JAVA_HOME=/cygdrive/c/pathtothejdk

将 java bin 目录路径添加PATH 环境变量也不会有害:

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

还要添加maven-enforce-plugin 以确保使用正确的JDK。这对你的 pom 来说是一个很好的做法。

<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 plugin – Usage

【讨论】:

  • 这对于指定 exact 版本的 JDK 来说是完美的。例如,我有一个项目在使用初始 JDK 1.8 时失败,但如果使用 JDK 1.8.0_77,它就可以正常工作。我安装了两个 JDK,并且有了这个解决方案,maven 告诉我,我使用了错误的 1.8 版本,直到我将 JAVA_HOME 路径更改为针对特定的 1.8.0_77 文件夹。其他答案不允许您对版本如此细化。
【解决方案6】:

我知道它是一个旧线程。但是我在 Maven for Java 8 编译器源代码中遇到了一些与此类似的问题。我通过this article 中提到的快速修复解决了这个问题,我想我可以把它放在这里,也许可以帮助其他人:

<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>

【讨论】:

  • 添加这些行后可能需要 Maven 更新(Eclipse:右键单击项目,Maven,更新项目)
  • 设置 maven.compiler 属性不会阻止代码使用 java 11 中添加的方法。例如 String.repeat()。这在使用 jdk 11 构建时。所以 maven 构建但我希望它会失败
【解决方案7】:

如果您通过Mac 中的brew 安装了Java,那么您很可能会在此处找到您的Java 主目录:

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

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

这里我们感兴趣的领域是: 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 环境变量。

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

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

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

这样,每当您的终端加载时,它将默认使用您在 JAVA_HOME 中定义的值。这是您需要在 ~/.profile 文件中添加的行:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

你可以打开一个新的终端查看Maven版本,(mvn -version),你会发现这次指向的是Java 8。

【讨论】:

  • 赞成。正是我需要的。谢谢队友:)
【解决方案8】:

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

【讨论】:

    【解决方案9】:

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

    【讨论】:

    • OP 正在命令行上构建一个 hudson 插件,而不是在 hudson 下(至少,这是我的理解)。
    【解决方案10】:

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

    安装后,您可以简单地“本地”更改 java 版本,即通过以下方式更改特定项目目录:

    jenv local 1.6
    

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

    jenv enable-plugin maven
    

    【讨论】:

    • 感谢 jenv maven 的推荐。
    【解决方案11】:

    您也可以在您的主目录~/.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

    【讨论】:

    • 被严重低估的评论,有了这个我能够在 RHEL 8 中持续设置 JAVA_HOME 版本
    【解决方案12】:

    我在 Windows 7 上的 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 安装而不是 JDK 作为默认 JVM,因此编译失败。

    我在 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
    

    编译错误已解决。

    【讨论】:

      【解决方案13】:

      对于 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>
      

      【讨论】:

        【解决方案14】:

        如果没有其他方法,即使您将 JAVA_HOME 设置为 正确 路径,请检查 &lt;user&gt;/.mavenrc 中是否没有覆盖 JAVA_HOME 路径!

        作为进一步的提示,mvn 文件是一个 bash 脚本(在 Linux 上)。因此,如有必要,您可以检查源 [并更改它]。

        【讨论】:

          猜你喜欢
          • 2014-12-23
          • 2021-07-12
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多