向前兼容的 Java 6 注释处理器和支持的源代码版本

我正在为一个项目试用Java 7,并从这种类型的注释处理器(Bindgen和Hibernate JPA modelgen)收到警告:

warning: Supported source version 'RELEASE_6' from annotation processor 'org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor' less than -source '1.7'

这是由注释处理器类上的注释引起的。由于它们是使用 Java 6 编译的,因此它们可用的最高值为 。Java 7 版本引入了 .@SupportedSourceVersion(SourceVersion.RELEASE_6)SourceVersionRELEASE_6SourceVersionRELEASE_7

我的问题:注释处理器应该如何处理向前兼容性?是否必须有单独的 jdk6 和 jdk7 二进制版本?难道我在这里不明白别的东西吗?

我只找到了有关此问题的以下信息:

使用

@Override
public SourceVersion getSupportedSourceVersion() {
    return SourceVersion.latest();
}

Oracle博客,其中评论者建议支持最新的源版本


答案 1

前向兼容性是通过适当地处理未知语言构造来处理的,例如通过实现ElementVisitor.visitUnknown

在上述Oracle博客中还有另一个条目,它提出了两个关于向前兼容性的策略:

  • 将处理器编写为只能使用当前语言版本。
  • 编写处理器以应对未知的未来构造。

第二个是通过返回问题中已经发布的内容来完成的。SourceVersion.latest()

我认为在大多数情况下这样做是可以的,当你确定其他语言元素不会破坏任何东西时。当然,您不应该只是假设即使使用较新版本,一切都会很好,您也应该对其进行测试。


好吧,我想处理未知语言结构听起来有点模糊,所以这里有一些例子。

假设您有一个处理器,用于检查已知语言构造(例如类上的注释)上的自定义类型的注释,并创建它所发现内容的简单文档。您可以放心地假设它也可以在较新版本中使用。在我看来,将其限制为特定版本不是一个好的决定。

假设你有一个处理器,可以检查它能找到的每个元素,并分析代码结构,从中生成一个图形。您可能会遇到较新版本的问题。您可能能够以某种方式处理未知语言构造(例如通过向图中添加未知节点),但只有在有意义时才这样做 - 并且值得麻烦的话。如果处理器在遇到未知的东西时不再有用,那么它应该坚持特定的java版本。

无论使用何种策略,在我看来,最好的方法是监视即将对语言进行的更改并相应地更新处理器。例如,在Java 7中,project coin引入了一些新的语言功能,这些功能很可能甚至对处理器都不可见。另一方面,Java 8确实有新的构造会影响处理,例如类型注释。但是,新的语言功能并不经常发生,因此您甚至不需要在很长一段时间内更改任何内容。


答案 2

推荐