同一编译过程中使用注释预处理和生成类的Maven示例?

16

有没有一个干净的范例可以展示在编译时预处理类注解,并在同一编译过程中生成要编译的类?

有没有一个逐步实施这样的项目的步骤流程?

3个回答

25

在浏览了许多现有的网络文档后,我得出了以下结论:

需要澄清的问题:

  • 为了处理给定项目P上的注释,您首先需要在单独的库S中编译一个注释处理器。P应该依赖于S。
  • 在Java 5中实现注释处理绝对不同于在Java 6中实现。
  • Java 5依赖于apt的单独执行。相应的教程herehere有助于理解Java 5中的注释处理和实现的基础知识。新手的好读物。
  • 使用Maven在Java 5中实现注释处理很棘手。需要添加到tools.jar的本地依赖项才能访问这些教程中描述的API。并不干净。一些调用apt的第三方插件可用,但文档不太完整。
  • 那些使用Java 6的人不应根据上述教程立即开始实施他们的处理器。

Maven中Java 6的注释处理

...和代码生成

  • 有一个称为CodeModel的优秀Java代码生成库可从Maven中央获取。这里提供了一个很好的教程here。javax注释处理包也提供了一些工具来生成输出。

2
这个答案有很多好的东西。但其中一件事是不正确的:你不能在一个Maven Pass中完成它。这里有一个例子,它还包括使用JCodeModel的注释处理器:https://github.com/jjYBdx4IL/example-maven-project-setups/tree/master/compile-time-annotation-processing - user1050755
@user1050755 感谢您提供的好建议。有一个问题:为什么您使用了JCodeModel而不是官方的呢?https://github.com/javaee/jaxb-codemodel - Don Rhummy

4

maven-processor-plugin可以完成这项任务...

https://code.google.com/p/maven-annotation-plugin/

文档中的示例:

<build> <plugins>
  <!-- Run annotation processors on src/main/java sources -->
  <plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <executions>
      <execution>
        <id>process</id>
        <goals>
          <goal>process</goal>
        </goals>
        <phase>generate-sources</phase>
      </execution>
    </executions>
  </plugin>
  <!-- Disable annotation processors during normal compilation -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <compilerArgument>-proc:none</compilerArgument>
    </configuration>
  </plugin>
</plugins> </build>

0
Maven-Antlr-Plugin可以实现这一点。它从语法中生成Java类,然后编译插件编译生成的类。也许maven-annotation-plugin会有用。

1
谢谢,但说实话我认为maven-antlr-plugin有点过头了。此外,该网站没有提供完整的示例来解决我提出的问题。我更倾向于使用AnnotationProcessor。maven-annotation-plugin看起来很有趣,但它还在进行中,文档不完整。没有帮助。 - Jérôme Verstrynge
我认为他并不是在倡导直接使用antlr插件,而是要查看其源代码以了解它是如何实现功能的。 - user177800

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接