gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:58:05 25 4
gpt4 key购买 nike

我的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com