java - 如何在注释处理器中支持多个源级目标
问题描述
我和我的团队正在维护一些包含使用Maven 注释插件生成的代码的应用程序。
当我意识到无论我如何配置插件、Maven 或 Eclipse,生成的代码都无法编译时,我正在测试从 Java 8 到 Java 11 的迁移。安装 JDK 11 后,编译器会报告一个错误,提示无法定位javax.annotation.Generated
导入。
我刚刚发现该特定导入实际上是由我们自己的注释处理器插入的。
我不能只将包Generated
从javax.annotation.Generated
(Java 8 中)更改为javax.annotation.processing.Generated
(Java 11 中),因为我们将在一段时间内(可能长达一年)同时使用这两个平台。我现在想知道是否以及如何动态选择要在生成的文件中导入的注释包。
解决方案
在尝试解决与我在此问题中描述的问题不同的问题时,我遇到了我在这里分享的答案。它来自Context
org.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 环境中那样输出。
推荐阅读
- javascript - 如何将我的 express 服务器(使用 graphql)部署到 Heroku。目前卡在构建中
- azure-devops - 根据另一个字段或规则的值,揭开 Azure DevOps 中某个字段的允许值的神秘面纱?
- angular - 我如何以反应形式调用Angular中的函数
- excel-formula - 忽略文本的最大公式
- javascript - 将 HTML 转换为水晶报表
- php - 在 PrestaShop 中将产品添加到购物车时出现致命错误
- javascript - 从以前的解决方案扩展表行问题
- laravel-5.7 - Laravel 5.7 不发送电子邮件并且不显示任何错误
- c++ - malloc 和 new 是否相互了解?
- sql-server - 我可以将压缩文件批量加载到 SQL Server 中吗?