为Maven指定JDK以供使用

时间:2010-03-23 21:11:47

标签: maven-2 settings java pom.xml

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

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

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

14 个答案:

答案 0 :(得分:112)

  

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

暂时更改您的JAVA_HOME

答案 1 :(得分:72)

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

答案 2 :(得分:25)

compile:compilea 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

答案 3 :(得分:22)

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

答案 4 :(得分:14)

我说你像Pascal一样设置JAVA_HOME说: 在cygwin中如果你使用bash作为你的shell应该是“export JAVA_HOME = / cygdrive / c / pathtothejdk” 使用“export PATH = $ {JAVA_HOME} / bin:$ {PATH}”

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

http://maven.apache.org/plugins/maven-enforcer-plugin/usage.html

答案 5 :(得分:11)

我知道它是一个旧线程。但是我在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>

答案 6 :(得分:5)

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

答案 7 :(得分:5)

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

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

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

enter image description here

我们在这里感兴趣的字段是: 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 env变量中添加JAVA_HOME主目录路径。

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

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

enter image description here

此问题是,如果您在新终端中再次检查Maven版本,则会发现它指向Java13。为避免这种情况,我建议在{{ 1}}文件。

这样,无论何时终端加载时,它都会默认使用您在JAVA_HOME中定义的值。这是您需要在JAVA_HOME文件中添加的行:
~/.profile

您可以打开一个新终端并检查Maven版本(~/.profile),这时它将发现它指向Java 8。

答案 8 :(得分:3)

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

答案 9 :(得分:1)

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

答案 10 :(得分: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将JVM安装视为默认JVM而不是JDK,因此在编译时失败了。

我在以下行添加到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

编译错误已解决。

答案 11 :(得分:0)

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

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

jenv local 1.6

启用mvn插件后,这也会使mvn在本地使用该版本:

jenv enable-plugin maven

答案 12 :(得分:0)

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

答案 13 :(得分:-1)

在下面https://www.oracle.com/java/technologies/javase-downloads.html安装Java 8后,立即在下面使用此命令对我也有用。

export JAVA_HOME=$(/usr/libexec/java_home)