Answers:
因此,最重要的是,有没有一种方法可以为单个Maven调用指定jdk?
临时更改JAVA_HOME
环境变量的值。
JAVA_HOME
可以在此文件中为Maven设置(至少在Mac上):/private/etc/mavenrc
-可以使用类似的东西(请注意反引号而不是单引号!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
export JAVA_HOME='D:/dev/java/jdk8/jre'
为我工作)
java -version
,它仍会打印以前的版本。
似乎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>
-Dmaven.compiler.fork=true
和-Dmaven.compiler.executable=/path/to/target/javac
。
compile:compile具有用户属性,该属性允许您指定的路径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自定义属性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
如您所说:“另外,我不想在所有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。
我说您JAVA_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>
我知道它是一个旧线程。但是我在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使用变量$ JAVACMD作为最终的Java命令,将其设置为Java可执行文件所在的位置,将把maven切换到其他JDK。
Hudson还允许您定义多个Java运行时,并使用其中之一来调用Maven。在配置页面上仔细查看。
如果您已经通过Java进行brew
了安装,Mac
那么您可能会在这里找到Java主目录:
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
现在的下一步是查找Java Home
maven指向哪个目录。要找到它,请输入以下命令:
mvn -version
我们在这里感兴趣的字段是:
Java version
和runtime
。
Maven当前指向Java 13
。另外,您可以在关键运行时下看到Java Home路径,这是:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home
要更改Maven的Java版本,我们需要将Java 8
Home路径添加到JAVA_HOME
env变量中。
为此,我们需要
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。
我在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
编译错误得到解决。
对于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>
管理多个jdk版本的另一种选择是jEnv
安装后,您可以通过以下方式简单地“本地”更改Java版本,即特定项目目录的Java版本:
jenv local 1.6
启用mvn插件后,这还将使mvn在本地使用该版本:
jenv enable-plugin maven
您还可以在主目录中的文件中为Maven设置JDK ~/.mavenrc
:
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
set JAVA_HOME="C:\Java\jdk7"