指定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。
请注意,此用户属性仅在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自定义属性的优先级 。
我说你设置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
编译错误得到解决。