4

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-plugin2.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>

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

4

2 回答 2

2

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

于 2014-10-07T07:36:52.487 回答
1

实际上,解决方案是将处理器依赖项从插件的依赖项中移出并进入正常的依赖项。请参阅原始帖子中的编辑#1。

虽然奇怪的是,在添加依赖项与未添加依赖项时出现编译错误。如果没有依赖项,我会看到有关使用内部专有 API 的编译器警告。添加注释处理器依赖项后,该警告将被视为错误。-Werror我在编译器选项中看不到任何将警告视为错误的选项。删除注释处理器依赖项后,编译通过并发出警告。在这个问题上抓挠我的头......

于 2014-10-08T23:10:29.927 回答