23

我正在为一个项目尝试 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. Java 7 版本SourceVersion引入了RELEASE_7.

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

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

使用的 Querdydsl 错误报告

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

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

4

1 回答 1

16

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

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

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

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

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


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

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

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

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

于 2011-11-18T20:44:24.127 回答