Maven 2 指定Maven要使用的JDK

Maven 2 指定Maven要使用的JDK,maven-2,settings,java,pom.xml,Maven 2,Settings,Java,Pom.xml,我正在尝试构建一个我修改过的Hudson插件,它需要jdk1.6。这很好,但我不知道如何告诉maven不同的jdk在哪里。我在网上发现很少有人提及,但他们似乎不适用于我。有些人建议在.m2/settings.xml中添加一些配置,但我没有settings.xml。另外,我不想对所有maven构建都使用1.6 一个纠结是我在cygwin中使用了mvn,如果这很重要的话。看起来我应该能够在项目pom文件中制定规范,但是现有的pom非常简单 所以底线是,有没有一种方法可以为maven的一次调用指定一个

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

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

所以底线是,有没有一种方法可以为maven的一次调用指定一个jdk

所以底线是,有没有一种方法可以为maven的一次调用指定一个jdk


暂时更改
JAVA\u HOME
环境变量的值。

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

我建议您设置
JAVA\u 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>

org.apache.maven.plugins
.

正如你所说的“另外,我不想对所有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>

org.apache.maven.plugins
maven编译器插件
3.7.0
1.9
1.9

它将确保您的特定项目使用该版本的jdk。

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

Maven现在似乎给出了一个解决方案:

假设您的
JAVA\u 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>

我在Windows7上的Eclipse中遇到了maven的构建问题

尽管我观察到mvn构建在命令行中运行得很好

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
编译错误已解决。

具有允许您指定到
javac
的路径

请注意,此用户属性仅在
fork
true
时有效,默认情况下
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 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>

UTF-8
1.8
1.8
对于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>

maven编译器插件
3.7.0
9
9

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

安装后,您只需“本地”更改java版本,即针对特定项目目录,方法如下:

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

jenv enable-plugin maven

您还可以在主目录
~/.mavenrc
中的文件中为Maven设置JDK:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'
此环境变量将由mvn脚本检查,并在出现时使用:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

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

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
现在的下一步是找到maven指向的
javahome
目录。要查找它,请在命令中键入:
mvn-版本

我们感兴趣的领域如下:
Java版本
运行时

Maven目前指向
Java13
。此外,您还可以在key runtime下看到Java主路径,即:
/usr/local/ceral/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home


要更改maven的Java版本,我们需要将
java8
home路径添加到
javahome
env变量中

为此,我们需要运行以下命令:
export JAVA_HOME=/Library/JAVA/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/HOME
在候机楼

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

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

这样,无论何时加载终端,它都将采用默认情况下在JAVA_主页中定义的值。这是您需要添加到
~/.profile
文件中的行:
export JAVA_HOME=/Library/JAVA/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/HOME


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

使用下面的命令对我也很有效,在这里安装Java 8之后立即使用它


OP是在命令行上构建hudson插件,而不是在hudson下(至少,这是我的理解)
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
export JAVA_HOME=$(/usr/libexec/java_home)