我正在尝试构建一个我修改过的Hudson插件,它需要jdk1.6。这很好,但我不知道如何告诉maven不同的jdk在哪里。我在互联网上发现很少提及但它们似乎并不适用于我。有人建议在.m2/settings.xml
添加一些配置,但我没有settings.xml
。另外,我不想对所有maven版本使用1.6。
一个问题是我在cygwin中使用mvn
,如果这很重要的话。看来我应该能够在项目pom文件中制作规范,但是现有的pom非常简单。
所以底线是,有没有办法为maven的单个调用指定一个jdk?
答案 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:compile有a user property,可让您指定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
答案 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
我们在这里感兴趣的字段是:
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
env变量中添加JAVA_HOME
主目录路径。
为此,我们需要运行以下命令:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
在终端中。
现在,如果我们检查Maven版本,我们可以看到它现在指向Java 8。
此问题是,如果您在新终端中再次检查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)