如何配置maven编译器以将java 5用于我的测试代码,将java 1.4用于我的主代码?
答案 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
的版本A
和main
和B
的版本test
严格小于A
,我们真的想实现以下目标:
B
)使用JDK版本Eclipse
,以免引入编译错误(项目图标上的红叉)。B
运行,这是发布所必需的。 mvn clean test
在main
中编译源代码,这可以自动检测是否使用了JDK A
中的新功能。B
的新功能/新API。以下pom声明有效(例如让B
和A = 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
参数。 target
和default-compile
是编译器插件的特殊名称。
第三,请确保使用default-testCompile
,而不要使用compilerArguments
。据我所知,在运行时只能使用compilerArgs
覆盖参数设置。