【问题标题】:Integrate annotation processor into the same project将注释处理器集成到同一个项目中
【发布时间】:2019-09-07 00:11:25
【问题描述】:

是否可以在定义它的同一个项目中使用注释处理器?

例子:

  • src/

    • MyAnnotation.java
    • path_to_MyAnnotationProcessor.MyAnnotationProcessor.java
    • 其他类
  • 资源
    • META-INF/services/javax.annotation.processing.Processor
  • pom

当我运行mvn clean install 时,我希望我的处理器将处理使用 MyAnnotation 注释的类。

我不想从另一个库导入已经编译的处理器,我只想在我的 src 中定义它后使用它。

现在,我收到错误: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project my-project: Compilation failure [ERROR] Annotation processor 'path_to_MyAnnotationProcessor' not found

pom.xml 的一部分,我在这里引用。给我的处理器:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.plugin.compiler}</version>
            <configuration>
                <source>${version.java}</source>
                <target>${version.java}</target>
                    <annotationProcessors>
                       <proc>path_to_MyAnnotationProcessor.MyAnnotationProcessor</proc>
                    </annotationProcessors>
            </configuration>
        </plugin>

感谢大家,尤其是 @Stefan Ferstl 和 @yegodm。来自yegodm的解决方案是: “一种方法是两个在同一个项目中有两个模块。一个模块将定义注释和处理器。另一个将它作为建立构建顺序的依赖项。”

【问题讨论】:

  • 你试过了吗? :)
  • 您是否尝试过,将元语法“path_to_MyAnnotationProcessor”替换为 .pom 中注释处理器的实际路径? (如果是,请发布您的 POM)
  • 一种方法是两个在同一个项目中有两个模块。一个模块将定义注释和处理器。另一个将它作为建立构建顺序的依赖项。
  • 如果这只是一个解决方案,那我就这样做,谢谢!
  • @BadZen 认为这是一种快速的解决方法。这就是为什么我不把它作为一个答案。对我来说,它工作得非常轻松。

标签: java spring maven


【解决方案1】:

解决此问题的最简单方法是将您的项目转换为一个多模块项目,其中注释处理器位于其自己的模块中。对于注解处理器有一个不同的模块,您可以使用全新的&lt;annotationProcessorPaths&gt; 选项通过groupId/artifactId 定义注解处理器。

使用注解处理器的模块可能需要对注解处理器模块的依赖才能首先构建它。

注意:在此答案的先前版本中,我描述了解决此问题的另一种方法,但显然不能开箱即用。该部分已被删除。

【讨论】:

  • 我试过这种方法,但同样的错误 - [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on项目 my_project_name:编译失败 [错误] 未找到注释处理器“path_to_MyAnnotationProcessor.MyAnnotationProcessor”
  • 但是,解决方案是创建多模块项目并在使用它的模块之前编译注释处理器模块。它有效。
  • @IgorDumchykov 好的,我会相应地更新我的答案。
  • 有没有办法强制maven先发布带有注解处理器的模块?并且还包含在依赖链解析中?
  • @PawelVeselov 我看到的唯一方法(也在答案中描述)是在需要处理器的模块中添加对注释处理器模块的依赖项。您可以为此使用 范围。
【解决方案2】:

您可以通过单独的编译器执行更早地编译您的处理器。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <execution>
                    <id>compile-generator</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <includes>
                            <include>com/example/YourProcessor.java</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我已经对此进行了测试,它可以工作 - 处理器确实会在实际编译阶段稍后被调用。

如果你也从同一个项目中预编译了一些其他类,那么你可以直接在处理器中引用和使用它们。这可能很有用。

【讨论】:

  • 感谢您的提示,它可以工作,但该类必须使用路径分隔符 char / 而不是 .
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多