maven - 编译不同Java版本的Maven模块

标签 maven maven-toolchains-plugin

我的maven项目有几个模块:服务器、Web等

我想在 Java 6 上构建除我的服务器模块之外的所有模块。对于服务器模块,我想使用 Java 7 对其进行编译。

下面是我的pom.xml,但我认为如果我将其修改为1.7,那么我的所有模块都将使用Java 7进行编译。另外,maven是否使用JAVA_HOME环境变量来确定要使用哪个Java版本?

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

编辑 另外,以下输出是否为

maven --version

表明maven正在用1.7编译我的java代码?

vagrant@dev:~/bin/apache-tomcat-7.0.29/bin$ mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)
Maven home: /home/vagrant/bin/apache-maven-3.0.4
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: /home/vagrant/bin/jdk1.7.0_07/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.2.0-23-generic", arch: "amd64", family: "unix"

谢谢, 凯文

最佳答案

有很多技巧可以使用与运行 Maven 不同版本的 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>

这种方法的问题是您现在已将 JDK 的路径硬编码到 POM 中。一切都会在您的机器上正常工作,但是当您因为硬盘故障而必须重建机器时,或者当您想在另一台机器上构建时,您将陷入困境,因为路径很可能不会匹配。

处理此问题的正确最佳实践方法是通过 Toolchains 。这将看到您创建一个 ~/.m2/toolchains.xml描述系统中每个不同工具链所在位置的文件。然后可以通过Maven Toolchains Plugin应用JDK的版本,例如

<plugins>
 ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-toolchains-plugin</artifactId>
    <version>1.0</version>
    <executions> 
      <execution>
        <phase>validate</phase>
        <goals>
          <goal>toolchain</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <toolchains>
        <jdk>
          <version>1.6</version>
        </jdk>
      </toolchains>
    </configuration>
  </plugin>
  ...
</plugins>

接下来的事情是,您并不像您想象的那样经常需要它。例如通过使用 sourcetarget您可以为您的目标 JRE 生成正确的字节码...您将遇到的唯一问题是使用 JRE 1.7 中的新方法...这就是 Mojo's Animal Sniffer Plugin Animal Sniffer 可用于确保您仅使用目标 JRE 的方法。社区的普遍共识是使用 sourcetarget Maven 编译器插件配置中的配置选项加上 Mojo 的动物嗅探器的使用实际上消除了编译器端对工具链的需求......在 Surefire 端仍然需要工具链......我有我需要更新编译器插件和工具链插件来处理一些边缘情况,但实际上您不会遇到这些边缘情况;-)

只是为了确保您原来的问题得到完全解答(因为上面回答了您想问的问题 - 而不是您问的问题)

目前您正在使用 JDK 1.7 进行编译但是,具体取决于您使用的 Maven 编译器插件的版本,您可能会使用 <source>1.4</source><target>1.4</target> 进行编译。或<source>1.5</source><target>1.5</target>除非您更改了 pom.xml 中 Maven 编译器插件的配置。这将决定您可以使用哪些语言功能,但不决定哪些类...因此您将生成可在 JRE 1.7 上运行的代码,并且假设您没有使用自 1.4/1.5 以来引入的任何新类/方法 (例如 String.isEmpty() )也应该在 JRE 1.4/1.5 上工作...确定它是否在这样的旧 JVM 上工作的唯一方法是:在旧 JVM 上运行它或使用 Animal Sniffer。

关于maven - 编译不同Java版本的Maven模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414209/

相关文章:

java - Maven 编译错误 - 包不存在

java - io.confluence 的不可解析父 POM :kafka-connect-storage

java - VisualVM 可以用于分析 Maven 项目吗?如果是的话怎么办?

java - Maven 项目对 JDK 版本的依赖

java - Maven 配置文件在运行 jdk 时激活,而不是在工具链 jdk 上激活

java - 如果 ~/.m2/toolchains.xml 不存在,则忽略使用工具链的 Maven 执行 block

java - 为 Hadoop 生成源代码时出现 Maven 错误

java - 生命周期配置未涵盖的插件执行 : org. apache.maven.plugins :maven-toolchains-plugin:1. 1:toolchain

Spring 启动: passing system properties to maven