我maven-compiler-plugin
在一个 Maven 项目中使用对我的代码执行注释处理。它一直在工作,直到我添加了一个<fork>true</fork>
配置选项。
pom.xml文件具有以下内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<dependencies>
<!-- Add dependency on the annotation processor -->
<dependency>
<groupId>x.y.z</groupId>
<artifactId>my-processor</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
my-processor-1.0.jar文件包含一个META-INF/services/javax.annotation.processing.Processorjavac
文件,以便编译器可以在运行时发现它。
当我使用此配置运行mvn clean compile时,我看到注释处理器运行并且生成的代码按预期放入target\generated-sources\annotations目录中。
但是,如果我<fork>true</fork>
在插件配置中添加一个选项,那么我观察到注释处理器没有运行,并且target\generated-sources\annotations目录中不存在任何代码。
我在maven-compiler-plugin
2.5.1、3.0 和 3.1 版本中进行了尝试(对于 3.x 版本,我必须<forceJavaCompilerUser>true</forceJavaCompilerUser>
在配置中添加一个选项,以便发现注释处理器 jar)。
我还尝试明确指定注释处理器:
<configuration>
...
<annotationProcessors>
<annotationProcessor>x.y.z.MyProcessor</annotationProcessor>
</annotationProcessors>
...
</configuration>
同样,对于版本 2.5.1、3.0 和 3.1,如果配置选项未指定分叉,则将调用注释处理器。指定选项时<fork>true</fork>
,注释处理器将不会运行。
我还在x.y.z:my_processor
依赖项之外添加了maven-compiler-plugin
依赖项,以确保已加载注释处理器依赖项。
maven-compiler-plugin
配置时注释处理是否仍然有效<fork>true</fork>
?还是我错误地配置了插件?
请注意,我不想将编译拆分为单独的执行(例如,一个执行在没有注释处理的情况下编译,使用<fork>true</fork>
,另一个执行只进行注释处理,使用<fork>false</fork>
,因为第二次执行再次重新编译整个源,这在处理成千上万的源文件,除非有办法解决这个问题)。
我正在使用 JDK 1.7.0_45。
编辑#1
实际上,解决方案是将处理器依赖项从插件的依赖项中移出并移至正常的依赖项中:
<dependencies>
<dependency>
<groupId>x.y.z</groupId>
<artifactId>my-processor</artifactId>
</dependency>
...
</dependencies>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
</configuration>
</plugin>
</plugin>
我以为我已经对此进行了测试,但我可能一直在寻找控制台输出(在进程分叉时不会出现),而不是寻找生成的代码的存在。