指定JDK供Maven使用

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

一个奇怪的是我在cygwin使用mvn ,如果这很重要的话。 看来我应该能够在项目文件中做出规范,但现有的POM是相当裸露的。

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

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

暂时改变你的JAVA_HOME

似乎Maven现在提供了一个解决scheme: 使用不同的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> 

正如你所说的“另外,我不希望所有的maven版本都使用1.6”….所以我会说修改你的pom文件并指定使用哪个jdk版本。

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

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

编译:compile有一个用户属性 ,允许你指定一个到javac的path。

请注意,此用户属性仅在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自定义属性的优先级 。

我说你设置JAVA_HOME就像Pascal所说:在cygwin中,如果你使用bash作为你的shell,应该是“export JAVA_HOME = / cygdrive / c / pathtothejdk”而且它也不会导致java bin目录导出到PATH中,导出PATH = $ {JAVA_HOME} / bin中:$ {PATH}”

并添加maven-enforce-plugin以确保使用正确的jdk。 这是你的朋友的好习惯。

 <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

我知道它是一个古老的线索。 但是我在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> 

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

哈德森还允许你定义几个Java运行时,并让你用这些之一调用Maven。 仔细看一下configuration页面。

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

我在Windows 7的Eclipse中使用Maven构build了一个问题。

虽然我观察到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作为JRE安装,而不是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 

编译错误得到解决。