首页 > 解决方案 > 如何在注释处理器中支持多个源级目标

问题描述

我和我的团队正在维护一些包含使用Maven 注释插件生成的代码的应用程序。

当我意识到无论我如何配置插件、Maven 或 Eclipse,生成的代码都无法编译时,我正在测试从 Java 8 到 Java 11 的迁移。安装 JDK 11 后,编译器会报告一个错误,提示无法定位javax.annotation.Generated导入。

我刚刚发现该特定导入实际上是由我们自己的注释处理器插入的。

我不能只将包Generatedjavax.annotation.Generated(Java 8 中)更改为javax.annotation.processing.Generated(Java 11 中),因为我们将在一段时间内(可能长达一年)同时使用这两个平台。我现在想知道是否以及如何动态选择要在生成的文件中导入的注释包。

标签: java

解决方案


在尝试解决与我在此问题中描述的问题不同的问题时,我遇到了我在这里分享的答案。它来自Contextorg.hibernate:hibernate-jpamodelgen:5.4.4.Final 中的类

        TypeElement java8AndBelowGeneratedAnnotation =
                pe.getElementUtils().getTypeElement( "javax.annotation.Generated" );
        if ( java8AndBelowGeneratedAnnotation != null ) {
            generatedAnnotation = java8AndBelowGeneratedAnnotation;
        }
        else {
            // Using the new name for this annotation in Java 9 and above
            generatedAnnotation = pe.getElementUtils().getTypeElement( "javax.annotation.processing.Generated" );
        }

这里的知识点是通过尝试访问“旧”注释,可以确定哪个平台正在运行。

谨防!但是请注意,这javax.annotation.Generated可能是由第三方库(而不是 JRE)引入的,这将使适当注释的动态选择无效。由于 org.bsc.maven:maven-processor-plugin 间接将 javax.annotation:jsr250-api 引入我的项目的构建环境,这发生在我身上。结果,Hibernate 注释处理器错误地输出javax.annotation.Generated,而不是javax.annotation.processing.Generated像在 Java 11 环境中那样输出。


推荐阅读