向前兼容的Java 6注释处理器和SupportedSourceVersion
我正在为一个项目尝试Java 7并从这种注释处理器(Bindgen和Hibernate JPA modelgen)获得警告:
warning: Supported source version 'RELEASE_6' from annotation processor 'org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor' less than -source '1.7'
这是由注释处理器类上的@SupportedSourceVersion(SourceVersion.RELEASE_6)
注释引起的。 由于它们是使用Java 6编译的,因此它们可用的SourceVersion
最大值是RELEASE_6
。 SourceVersion
的Java 7版本引入了RELEASE_7
。
我的问题:注释处理器如何处理前向兼容性? 是否必须有单独的jdk6和jdk7二进制版本? 我在这里不理解其他什么吗?
我只发现了有关此问题的以下信息:
使用的Querdydsl错误报告
@Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); }
Oracle博客 ,其中评论员建议支持最新的源版本
通过适当地处理未知语言结构来处理向前兼容性,例如通过实现ElementVisitor.visitUnknown 。
在上述Oracle博客中还有另一个条目,它提出了两个有关向前兼容性的政策:
- 将处理器写入仅使用当前语言版本。
- 编写处理器以应对未知的未来构造。
第二个是通过返回已在问题中发布的SourceVersion.latest()
来完成的。
我认为在大多数情况下这样做是可以的,当你确定其他语言元素不会破坏任何东西时。 当然,你不应该只是假设即使使用较新的版本,一切都会很好,你也应该测试一下。
好吧,我觉得处理未知的语言结构听起来有点模糊,所以这里有一些例子。
假设您有一个处理器,它检查已知语言结构上的自定义注释类型(例如,类上的注释),并创建一个简单的文档,说明它找到了什么。 你可以安全地假设它也适用于较新的版本。 在我看来,将它限制在特定版本并不是一个好的决定。
假设您有一个处理器,它检查它可以找到的每个元素,并分析代码结构以生成一个图形。 您可能会遇到较新版本的问题。 您可能能够以某种方式处理未知的语言结构(例如通过向图表添加未知节点),但只有在有意义的情况下才能执行此操作 – 并且如果它值得麻烦。 如果处理器在面对未知的东西时不再有用,它可能应该坚持特定的Java版本。
无论使用何种策略,我认为最好的方法是监控即将发生的语言更改并相应地更新处理器。 例如,在Java 7中, 项目硬币引入了一些新的语言function,这些function很可能甚至对处理器不可见。 另一方面,Java 8确实有新的结构会影响处理,例如类型注释 。 新的语言function通常不会发生,所以很有可能你甚至不需要长时间改变任何东西。