2011-11-18 52 views
21

我想出來的Java 7的一個項目,並得到這種從註釋處理器警告(定義BindGen和Hibernate JPA modelgen):向前兼容的Java 6註解處理器和SupportedSourceVersion

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_6SourceVersion的Java 7版本引入了RELEASE_7

我的問題:註釋處理器應該如何處理向前兼容性?是否必須有單獨的jdk6和jdk7二進制版本?我在這裏沒有理解別的嗎?

我只找到關於這一問題的以下信息:

Querdydsl bug report其使用

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

Oracle blog其中的評註建議支持最新的源代碼版本

回答

12

向前兼容性是通過處理未知的語言處理適當構建,例如通過實施ElementVisitor.visitUnknown

有一個在提到Oracle blog另一個項目,這表明對於向前兼容兩種策略:

  • 寫處理器只工作與當前的語言版本。
  • 編寫處理器以應對未知的未來構造。

第二個是通過返回SourceVersion.latest()如已經發布的問題進行。

我認爲在大多數情況下可以這樣做,當你確定其他語言元素不會破壞任何東西。當然,你不應該假設即使有更新的版本,一切都會好的,你也應該測試一下。


好吧,我猜處理未知語言構造適當聽起來有點模糊,所以這裏有一些例子。

假設您有一個處理器,用於檢查已知語言結構上的自定義註釋類型(例如,類中的註釋)並創建它找到的簡單文檔。你可能很安全地認爲它也可以在更新的版本中工作。限制它到一個特定的版本將不是一個好的決定在我看來。

假設您有一個處理器,它檢查它可以找到的每個元素並分析代碼結構以生成一個圖表。您可能會遇到新版本的問題。您可能能夠以某種方式處理未知的語言結構(例如通過向圖中添加一個未知的節點),但只有在這種情況下才能做到這一點 - 並且如果這樣做是值得的。如果處理器在面對未知事物時不再有用,它應該堅持一個特定的Java版本。

無論使用何種策略,我認爲最好的方法就是監控即將到來的語言變更並相應更新處理器。例如,在Java 7中,project coin引入了一些新的語言特性,這些特性很可能對處理器來說是不可見的。另一方面,Java 8確實有新的構造會影響處理,例如type annotations。新的語言功能不會經常發生,所以很可能你甚至不需要長時間改變任何東西。

+1

感謝您的初始文章和更新。我還沒有接受你的答案,因爲我仍然(非常兼職)將註釋處理器轉換爲Java 7.我想看看是否有其他東西彈出。 – bernie