【问题标题】:maven-compiler-plugin does not do annotation processing when fork=true is specified?指定 fork=true 时,maven-compiler-plugin 不进行注释处理?
【发布时间】: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 目录,正如预期的那样。

但是,如果我在插件配置中添加了一个&lt;fork&gt;true&lt;/fork&gt; 选项,那么我观察到注释处理器没有运行,并且 target\generated-sources\annotations 目录中没有代码。

我在 maven-compiler-plugin 版本 2.5.1、3.0 和 3.1 上进行了尝试(对于 3.x 版本,我必须在配置中添加一个 &lt;forceJavaCompilerUser&gt;true&lt;/forceJavaCompilerUser&gt; 选项,以便发现注释处理器 jar)。

我也尝试明确指定注解处理器:

<configuration>
  ...
  <annotationProcessors>
    <annotationProcessor>x.y.z.MyProcessor</annotationProcessor>
  </annotationProcessors>
  ...
</configuration>

同样,对于版本 2.5.1、3.0 和 3.1,如果配置选项未指定分叉,则将调用注释处理器。当指定&lt;fork&gt;true&lt;/fork&gt; 选项时,注释处理器将不会运行。

我还在maven-compiler-plugin 依赖项之外添加了x.y.z:my_processor 依赖项,以确保已加载注释处理器依赖项。

maven-compiler-plugin 配置为&lt;fork&gt;true&lt;/fork&gt; 时,注解处理是否仍然有效?还是我错误地配置了插件?

请注意,我不想将编译拆分为单独的执行(例如,一个执行编译不进行注释处理,使用&lt;fork&gt;true&lt;/fork&gt;,另一个执行只执行注释处理,使用&lt;fork&gt;false&lt;/fork&gt;,因为第二个执行重新编译再次访问整个源,这在处理数千个源文件时很糟糕,除非有办法解决这个问题)。

我使用的是 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


    【解决方案1】:

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

    【讨论】:

    • 谢谢...实际上解决方案需要将处理器依赖项移出“maven-compiler-plugin”部分并进入“依赖项”部分。 '-processor' 选项没有其他效果。
    • 啊,好吧。您可能希望将其作为官方答案并接受它,以便遇到相同问题的任何人都可以轻松找到解决方案 (stackoverflow.com/help/self-answer)。
    【解决方案2】:

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

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

    【讨论】:

    • 我有同样的问题 - 我有一个 JAR(工件 apt)= 我的注释处理器,我在插件中使用它(工件中的 Mojo apt-plugin ) 仅使用此注释处理器运行 Javac 工具。我在项目 X 中使用它。当 apt 的依赖项在项目依赖项中时,就可以了。但是当我只是在插件depencies/dependency 中使用它时,它不起作用。 Maven 模型说plugin 中的dependencies 是......“这个项目需要引入插件类加载器的附加依赖项。”但是当我调试插件时,它不会在任何项目中提供我的依赖项。get...
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多