用于test和main的不同maven编译器版本

时间:2009-07-31 17:40:32

标签: java maven compiler-construction maven-2 maven-3

如何配置maven编译器以将java 5用于我的测试代码,将java 1.4用于我的主代码?

3 个答案:

答案 0 :(得分:26)

如果要设置与相关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>

答案 1 :(得分:14)

对于使用maven-compiler-plugin版本3.5.1编译java 7源代码和java 8测试源的已接受答案,我没有运气。因为compile插件使用了main和test源的源/目标参数。

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

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

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

答案 2 :(得分:0)

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

我正在编写一个需要与Java 1.7兼容但要依靠JDK 8中的nashorn引擎来测试其某些功能的库,这是为{{ 1}}和main

在谈论针对主程序和测试使用不同的编译器/ JRE版本时,请说test的版本AmainB的版本test严格小于A,我们真的想实现以下目标:

  1. 在开发过程中使IDE(在我的情况下为B)使用JDK版本Eclipse,以免引入编译错误(项目图标上的红叉)。
  2. 使JUnit测试可在您的IDE中运行。
  3. 使JUnit测试可从命令行通过B运行,这是发布所必需的。
  4. 使用JRE mvn clean testmain中编译源代码,这可以自动检测是否使用了JDK A中的新功能。
  5. 在测试用例代码中免费使用JDK B的新功能/新API。

以下pom声明有效(例如让BA = 1.7):

B = 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> 是使Eclipse满意并为项目本身使用1.8的必要条件,正如其他人指出的那样,Eclipse仍有一个尚待解决的错误,并且本机不支持单个项目中的不同JDK版本。 / p>

第二,在源代码编译和测试源代码编译期间,使用<source>1.8</source> <target>1.8</target>覆盖<execution>source参数。 targetdefault-compile是编译器插件的特殊名称。

第三,请确保使用default-testCompile,而不要使用compilerArguments。据我所知,在运行时只能使用compilerArgs覆盖参数设置。