29

如何配置 maven 编译器以使用 java 5 作为我的测试代码和 java 1.4 作为我的主要代码?

4

3 回答 3

31

如果要设置对相关 Java 版本的合规性,可以为每次执行配置编译器插件。假设 Maven 使用的 JDK 至少与您指定的最高版本一样最新。通过使用属性,您可以在命令行或子项中覆盖该配置(如果需要):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>${compileSource}</source>
    <target>${compileSource}</target>
  </configuration>
  <executions>
    <execution>
      <id>test-compile</id>
      <phase>process-test-sources</phase>
      <goals>
        <goal>testCompile</goal>
      </goals>
      <configuration>
        <source>${testCompileSource}</source>
        <target>${testCompileSource}</target>
      </configuration>
    </execution>
  </executions>
</plugin>
...
<properties>
  <compileSource>1.4</compileSource>
  <testCompileSource>1.5</testCompileSource>
</properties>

如果您的意思是使用不同的编译器,那就更复杂了。因为您需要指定 JDK 的路径以及您使用的编译器版本。同样,这些可以在属性中定义。尽管您可能想在 settings.xml 中定义它们

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>${compileSource}</source>
    <target>${compileSource}</target>
    <executable>${compileJdkPath}/bin/javac</executable>
    <compilerVersion>${compileSource}</compilerVersion>
  </configuration>
  <executions>
    <execution>
      <id>test-compile</id>
      <phase>process-test-sources</phase>
      <goals>
        <goal>testCompile</goal>
      </goals>
      <configuration>
        <source>${testCompileSource}</source>
        <target>${testCompileSource}</target>
        <executable>${testCompileJdkPath}/bin/javac</executable>
        <compilerVersion>${testCompileSource}</compilerVersion>
      </configuration>
    </execution>
  </executions>
</plugin>
...
<properties>
  <compileSource>1.4</compileSource>
  <testCompileSource>1.5</testCompileSource>
  <compileJdkPath>path/to/jdk</compileJdkPath>
  <testCompileJdkPath>path/to/test/jdk<testCompileJdkPath>
</properties>

请注意,在配置文件中定义编译器配置可能是有意义的,为您支持的每个 JDK 配置一个配置文件,以便您的正常构建不依赖于设置的属性。

此外,在 Maven 3.x 中,您需要fork在指定可执行文件时包含参数,例如:

  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
      <execution>
        <id>default-testCompile</id>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
        <configuration>
          <fork>true</fork>
          <executable>${testCompileJdkPath}/bin/javac</executable>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>            
      </execution>
    </executions>
  </plugin>
于 2009-07-31T17:48:39.350 回答
18

maven-compiler-plugin我对使用3.5.1 版本编译 java 7 源和 java 8 测试源的接受答案不走运。因为编译插件对主源和测试源都使用了源/目标参数。

但我发现,测试源和目标有单独的配置参数。

所以对我来说,有效的解决方案是

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <testSource>1.8</testSource>
                <testTarget>1.8</testTarget>
            </configuration>
        </plugin>
    </plugins>
</build>
于 2016-08-03T12:39:32.223 回答
0

我至少为我的情况找到了解决方案。

我正在编写一个需要与 Java 1.7 兼容但依赖nashorn于 JDK 8 中的引擎来测试其某些功能的库,这是使用不同的编译器/jdk 版本maintest.

当谈到对 main 和 test 使用不同的编译器/JRE 版本时,比如 version Aformain和 version Bfor testandA严格小于B,我们真的想要实现以下目标:

  1. 让 IDE(在我的例子中,Eclipse)在开发期间使用 JDK 版本B,以免引入编译错误(项目图标上的红色叉号)。
  2. 使 JUnit 测试可在您的 IDE 中运行。
  3. mvn clean test使 JUnit 测试可从发布所需的命令行运行。
  4. main使用 JRE编译源代码A,这可以自动检测使用来自 JDK 的新功能B
  5. B在测试用例代码中免费使用来自 JDK 的新功能/新 API 。

以下 pom 声明有效(例如 letA = 1.7B = 1.8):

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <fork>true</fork>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
                <executions>
                   <execution>
                      <id>default-compile</id>
                      <configuration>
                         <compilerArguments>
                            <source>1.7</source>
                            <target>1.7</target>
                         </compilerArguments>
                      </configuration>
                   </execution>
                   <execution>
                      <id>default-testCompile</id>
                      <configuration>
                         <compilerArguments>
                            <source>1.8</source>
                            <target>1.8</target>
                         </compilerArguments>
                      </configuration>
                   </execution>
                </executions>
            </plugin>

首先,<source>1.8</source> <target>1.8</target>必须让 Eclipse 满意并为项目本身使用 1.8,正如其他人指出的那样,Eclipse 仍有一个未决的错误,并且本机不支持单个项目中的不同 JDK 版本。

其次,用于在源码编译和测试源码编译期间<execution>覆盖source和参数。并且是编译器插件的特殊名称。targetdefault-compiledefault-testCompile

第三,一定要使用compilerArguments但不要compilerArgs。据我所知,只能compilerArguments用于在运行时覆盖参数设置。

于 2020-04-16T14:25:36.733 回答