如何防止Maven在src/test/java中编译在generatesources阶段生成的类?
在我们的jOOQ集成测试中,我们使用jOOQ代码生成插件将类生成到src/test/java
目录中。我们这样做是因为:
- 我们希望签入生成的源代码,以便更容易地在代码生成器中检测回归
- 生成的类由测试使用
因此,(简化的)插件配置如下所示:
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
<execution>
<id>some-id</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<generator>
<target>
<directory>src/test/java</directory>
</target>
</generator>
</configuration>
</execution>
</executions>
</plugin>
不幸的是,这似乎让Maven认为,这样生成的类也需要在compile
阶段进行编译,如以下日志输出所示:
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ ... ---
[INFO] Compiling 25 source files to C:\...\target\classes
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ ... ---
[INFO] Compiling 25 source files to C:\...\target\test-classes
。。。这毫无意义。在src/main/java
和src/test/java
被包括为compileSourceRoots
时的调试输出提示:
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile' with basic configurator -->
[DEBUG] (f) compileSourceRoots = [C:\...\src\main\java, C:\...\src\test\java]
对于记录,在testCompile
阶段,正如预期的那样,只有src/test/java
被放置在compileSourceRoots
路径上:
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile' with basic configurator -->
[DEBUG] (f) compileSourceRoots = [C:\...\src\test\java]
为了记录在案,我们使用的是Maven 3.6.2
如何防止src/test/java
目录被添加到compileSourceRoots
变量中
# 1 楼答案
一个解决方法(不是很漂亮)是从编译器插件中排除测试类:
另一种方法是使用
generate-test-sources
阶段,这是我们迄今为止避免的,因为我们想在compile
阶段之前测试一些不相关的副作用:我当然希望有更好的解决方案