使用不同的Java版本编译Maven模块
我的maven项目有几个模块:服务器、web等 我想在Java6上构建除服务器模块以外的所有模块。对于服务器模块,我想用Java7编译它 下面是我的pom.xml,但我认为如果我将其修改为1.7,那么我的所有模块都将使用Java7编译。另外,maven是否使用JAVA_HOME环境变量来确定要使用哪个JAVA版本使用不同的Java版本编译Maven模块,maven,Maven,我的maven项目有几个模块:服务器、web等 我想在Java6上构建除服务器模块以外的所有模块。对于服务器模块,我想用Java7编译它 下面是我的pom.xml,但我认为如果我将其修改为1.7,那么我的所有模块都将使用Java7编译。另外,maven是否使用JAVA_HOME环境变量来确定要使用哪个JAVA版本 <plugin> <groupId>org.apache.maven.plugins</groupId> &
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<memmax>2048m</memmax>
</configuration>
</plugin>
谢谢,
Kevin使用顶级pom上的JDK6设置,它将被所有模块继承,并使用所需的不同配置覆盖服务器pom
至于JDK的路径,您可以指定它,请参见此处:对于使用不同版本的JDK编译源代码,有许多黑客攻击,例如,您可以使用
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<executable><!-- path-to-javac --></executable>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
接下来的事情是,你不需要像你想象的那样经常使用它。例如,通过使用源
和目标
值,可以为目标JRE生成正确的字节码。。。然后您将遇到的唯一问题是如何使用JRE 1.7中新增的方法。。。这就是我们的目的。动物嗅探器可用于确保您只使用您所针对的JRE方法。社区的普遍共识是,在Maven编译器插件配置中使用源
和目标
配置选项,再加上使用Mojo的动物嗅探器,实际上不需要编译器端的工具链。。。。当然,仍然需要工具链。。。我有一些需要更新编译器插件和工具链插件来处理的边缘情况,但实际上,您不会遇到这些边缘情况;-)
只是为了确保你原来的问题得到了完全的回答(因为上面回答的是你想问的问题,而不是你问的问题)
目前您正在使用JDK1.7进行编译,但是根据您使用的Maven编译器插件的版本,您可能正在使用1.41.4
或1.51.5
进行编译,除非您在pom.xml
中更改了Maven编译器插件的配置。这将决定哪些语言功能对您可用,但不是哪些类。。。因此,如果您没有使用自1.4/1.5(例如String.isEmpty()
)之后引入的任何新类/方法,那么您将生成可在JRE 1.7上工作的代码,并且也可在JRE 1.4/1.5上工作。。。要确定它是否能在这样一个旧的JVM上工作,唯一的方法是:在旧的JVM上运行它,或者使用动物嗅探器。Maven工具链
要使用多个Java版本,您需要使用,这要求您在~/.m2
Maven文件夹中创建一个toolschains.xml
文件,其中包含您机器上安装的所有Java版本:
<toolchains>
<toolchain>
<type>jdk</type>
<provides>
<id>Java13</id>
<version>13</version>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_13}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<id>Java9</id>
<version>9</version>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_9}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<id>Java8</id>
<version>8</version>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_8}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<id>Java7</id>
<version>7</version>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_7}</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<id>Java6</id>
<version>6</version>
</provides>
<configuration>
<jdkHome>${env.JAVA_HOME_6}</jdkHome>
</configuration>
</toolchain>
</toolchains>
现在,我们需要指示编译器和测试插件使用已配置的java版本
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>${jdk.version}</version>
</jdk>
</toolchains>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
</plugins>
</build>
就这样,我们现在可以使用自己的最低可行Java版本构建每个模块。基于我在原始帖子中包含的maven——版本输出,这是否意味着mvn是使用1.7编译的?根据您的输出,您将使用JDK1.7编译应用程序,但您的代码将为JDK1.6(或更高版本)编译,这很符合您的需要。请解释“mvn--version”输出与my pom.xml中的和值之间的关系。如果我只想用1.7编译,这是否意味着我需要将and更改为1.7?mvn--版本,让您看到当前使用的环境。关于source和target参数,这些参数将指定如何使用javac工具设置相同的参数:请参阅以下链接中对这些参数的描述:因此,在您的上下文中,您告诉JDK 1.7首先确保源代码只包含1.6 VM和/或更低版本的可用功能,然后你告诉它生成与JVM 1.6或更高版本兼容的二进制文件。就像给pom添加maven编译器插件和添加和配置选项添加一条捷径一样,设置一些属性,编译器插件检查“1.7${java.version}${java.version}”“编辑这个最重要的答案来澄清正确交叉编译的新最佳实践是使用javac
--release
标志(请参阅),这有意义吗?”?它在配置方面更容易,速度更快(不需要为每个模块分叉进程),适用于Java7+。工具链可能仍然有用,例如,如果还需要在目标JVM上运行测试或为古代Java(6或更早版本)编译。env变量是,但在$M2_HOME/conf/settings.xml
()中仍然受支持,感谢您的提示。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>${jdk.version}</version>
</jdk>
</toolchains>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
</plugins>
</build>
<properties>
<jdk.version>8</jdk.version>
...
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>${jdk.version}</version>
</jdk>
</toolchains>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
</plugins>
</build>
<properties>
<jdk.version>9</jdk.version>
</properties>