Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不同的Java版本编译Maven模块_Maven - Fatal编程技术网

使用不同的Java版本编译Maven模块

使用不同的Java版本编译Maven模块,maven,Maven,我的maven项目有几个模块:服务器、web等 我想在Java6上构建除服务器模块以外的所有模块。对于服务器模块,我想用Java7编译它 下面是我的pom.xml,但我认为如果我将其修改为1.7,那么我的所有模块都将使用Java7编译。另外,maven是否使用JAVA_HOME环境变量来确定要使用哪个JAVA版本 <plugin> <groupId>org.apache.maven.plugins</groupId> &

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

我想在Java6上构建除服务器模块以外的所有模块。对于服务器模块,我想用Java7编译它

下面是我的pom.xml,但我认为如果我将其修改为1.7,那么我的所有模块都将使用Java7编译。另外,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>
谢谢,
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>