将注释处理器集成到同一项目中

时间:2019-04-16 20:02:24

标签: java spring maven

是否可以在定义了注释的项目中使用注释处理器?

示例:

  • 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的解决方案是: “一种方法是两个在同一个项目中有两个模块。一个模块将定义注释和处理器。另一个模块将其作为建立构建顺序的依赖项。”

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

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

如果您也从同一项目中预编译了其他一些类,则可以直接引用它们并在处理器中使用它们。那可能有用。