当指定fork = true时,maven-compiler-plugin不进行注释处理?

时间:2014-10-07 04:29:17

标签: maven annotations javac maven-compiler-plugin

我在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>选项,则注释处理器将无法运行。

我还在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>

我以为我测试了这个,但我可能一直在寻找控制台输出(在进程分叉时不会出现),而不是寻找生成代码的存在。

2 个答案:

答案 0 :(得分:1)

在分叉模式下由maven调用时,您需要使用compilerArgs选项将-processor选项传递给javac。

答案 1 :(得分:1)

实际上,解决方案是将处理器依赖性从插件的依赖性转移到正常的依赖关系中。请参阅原始帖子中的编辑#1。

虽然奇怪的是,在添加依赖项时,与未添加依赖项时相比,我收到了编译错误。没有依赖关系,我看到编译器警告使用内部专有API。添加注释处理器依赖项后,该警告将被视为错误。我无法在编译器选项中看到任何将警告视为错误的-Werror选项。删除注释处理器依赖项后,编译将传递警告。抓住我的头......