【发布时间】:2014-12-01 10:34:39
【问题描述】:
我在一个 maven 项目中使用maven-compiler-plugin 对我的代码执行注释处理。在我添加 <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.Processor 文件,因此它可以被javac 运行时编译器。
当我使用此配置运行 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> 选项时,注释处理器将不会运行。
我还在maven-compiler-plugin 依赖项之外添加了x.y.z:my_processor 依赖项,以确保已加载注释处理器依赖项。
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>
我以为我已经对此进行了测试,但我可能一直在寻找控制台输出(在进程分叉时不会出现)而不是寻找生成的代码的存在。
【问题讨论】:
标签: maven annotations javac maven-compiler-plugin