如何配置 maven 编译器以使用 java 5 作为我的测试代码和 java 1.4 作为我的主要代码?
3 回答
如果要设置对相关 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>
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>
我至少为我的情况找到了解决方案。
我正在编写一个需要与 Java 1.7 兼容但依赖nashorn
于 JDK 8 中的引擎来测试其某些功能的库,这是使用不同的编译器/jdk 版本main
和test
.
当谈到对 main 和 test 使用不同的编译器/JRE 版本时,比如 version A
formain
和 version B
for test
andA
严格小于B
,我们真的想要实现以下目标:
- 让 IDE(在我的例子中,
Eclipse
)在开发期间使用 JDK 版本B
,以免引入编译错误(项目图标上的红色叉号)。 - 使 JUnit 测试可在您的 IDE 中运行。
mvn clean test
使 JUnit 测试可从发布所需的命令行运行。main
使用 JRE编译源代码A
,这可以自动检测使用来自 JDK 的新功能B
。B
在测试用例代码中免费使用来自 JDK 的新功能/新 API 。
以下 pom 声明有效(例如 letA = 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>
首先,<source>1.8</source> <target>1.8</target>
必须让 Eclipse 满意并为项目本身使用 1.8,正如其他人指出的那样,Eclipse 仍有一个未决的错误,并且本机不支持单个项目中的不同 JDK 版本。
其次,用于在源码编译和测试源码编译期间<execution>
覆盖source
和参数。并且是编译器插件的特殊名称。target
default-compile
default-testCompile
第三,一定要使用compilerArguments
但不要compilerArgs
。据我所知,只能compilerArguments
用于在运行时覆盖参数设置。