指定供Maven使用的JDK


141

我正在尝试构建已修改的Hudson插件,它需要jdk1.6。很好,但是我看不到如何告诉Maven不同的jdk在哪里。我在互联网上发现的提及很少,但似乎不适用于我。一些建议添加一些配置,.m2/settings.xml但我没有settings.xml。另外,我不想在所有Maven版本中都使用1.6。

一个弯头就是我mvn在cygwin中使用,如果那很重要的话。看来我应该能够在项目pom文件中进行说明,但是现有的pom几乎没有内容。

因此,最重要的是,有没有一种方法可以为单个Maven调用指定jdk?

Answers:


142

因此,最重要的是,有没有一种方法可以为单个Maven调用指定jdk?

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


10
Windows中的示例:set JAVA_HOME="C:\Java\jdk7"
acdcjunior 2014年

6
在lubuntu中:JAVA_HOME =“ / home / desa / programas / jdks / jdk1.6.0_45 /” mvn -v
Enrique San

8
万一其他人忘记并花了很多时间想知道为什么不能更改它:JAVA_HOME可以在此文件中为Maven设置(至少在Mac上):/private/etc/mavenrc -可以使用类似的东西(请注意反引号而不是单引号!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
Unix :(export JAVA_HOME='D:/dev/java/jdk8/jre'为我工作)
Christophe Roussy

2
如果我更改JAVA_HOME然后执行操作java -version,它仍会打印以前的版本。
ocramot19年

82

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

18
投票了!我发现我可以在命令行中使用-Dmaven.compiler.fork=true-Dmaven.compiler.executable=/path/to/target/javac
Jin Kwon

即使使用那些Java-opts,您仍然必须将其添加到编译器插件<executable> $ {maven.compiler.executable} </ executable>
Paul Gregoire

2
@JinKwon通过-D传递选项可以很好地工作,即使没有在编译器插件部分中对其进行定义。偶尔使用或编写脚本非常好。您应该将它放在一个单独的答案中,以便我们投票!
盖坦·莱曼

当我尝试在Java 8中运行测试时,此解决方案失败了,我获得*不受支持的major.minor版本52.0 *
edwin

39

compile:compile具有用户属性,该属性允许您指定的路径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自定义属性priority


我还需要覆盖我的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
Enrique S. Filiage

24

如您所说:“另外,我不想在所有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。


6
这只是起点,而不是解决方案。这是maven编译器插件针对1.7进行编译的要求。然后,诀窍是使Maven真正有能力针对1.7进行编译,如果您当前的Java版本不同,那么它就不是那么简单了……
Sergey Ushakov


14

我说您JAVA_HOME像Pascal那样设置环境变量:在Cygwin中,如果您使用bash作为shell,则应为:

export JAVA_HOME=/cygdrive/c/pathtothejdk

将java 目录路径添加到环境变量前面也不会有任何危害:binPATH

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插件–用法


1
这对于指定JDK 的确切版本是完美的。例如,我有一个使用初始JDK 1.8时失败的项目,但是如果使用JDK 1.8.0_77,它就可以正常工作。我已经安装了两个JDK,并且使用此解决方案,maven告诉我使用了错误的1.8版本,直到我更改了JAVA_HOME路径以定位到特定的1.8.0_77文件夹。其他答案不允许您如此仔细地了解版本。
bojingo

13

我知道它是一个旧线程。但是我在Maven for Java 8编译器源中遇到了与此类似的问题。我通过本文中提到的快速修复方法解决了这个问题,认为我可以将其放在此处,也可以帮助其他人:

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

1
添加以下行后,可能需要进行Maven更新(Eclipse:在项目上单击鼠标右键,在Maven中更新项目)
Romano

设置maven.compiler属性不会阻止代码使用Java 11中添加的方法。对于实例String.repeat()。这与JDK 11.所以行家建设建立的时候,但我希望它会失败
恩里科Giurin

6

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


谢谢伙伴,花了10个小时后,我们在您的答复帮助下进行了修复。
Mukul_3062 '19

3

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


OP在命令行上而不是在hudson下构建hudson插件(至少,这是我的理解)。
Pascal Thivent 2010年

3

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

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

现在的下一步是查找Java Homemaven指向哪个目录。要找到它,请输入以下命令:
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 8Home路径添加到JAVA_HOMEenv变量中。

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

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

在此处输入图片说明

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

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

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


0

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

同样,从日食开始时,我在下面的“目标”部分中使用了:

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

编译错误得到解决。


0

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

0

管理多个jdk版本的另一种选择是jEnv

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

jenv local 1.6

启用mvn插件后,这还将使mvn在本地使用该版本:

jenv enable-plugin maven

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.