2017-07-19 87 views
0

下面的代碼與Eclipse編譯:使用註釋(org.eclipse.jdt.annotation.Nullable)的使用Eclipse編譯,而不是用javac

@Retention(RetentionPolicy.CLASS) 
@Target({ TYPE_USE }) 
public @interface Nullable { 
    // This is org.eclipse.jdt.annotation.Nullable 
} 

class SomeClass { 

    private final [email protected] Inner b; 

} 

,但它不會與甲骨文的javac(版本1.8。 0_141),即產生以下錯誤:

SomeClass.java: error: annotation type not applicable to this kind of declaration 

我打賭的javac和Eclipse的編譯器上TYPE_USE的處理有所不同,但我無法找到一個解決辦法,以保持註釋在我的代碼(應該編譯在Eclipse和javac中)。有關此事的任何線索?

+0

'@Nullable SomeOtherClass.Inner b'是否相同且可編譯?這是一個奇怪的結構,我從未見過。 – Seelenvirtuose

+0

'@Nullable SomeOtherClass.Inner b'不能編譯(使用Eclipse Luna),出現以下錯誤:'類型註釋不允許用於訪問靜態成員的類型名稱。如果我沒有記錯,過去曾經有過編譯的過程,但在更新Eclipse時(我們開發Eclipse插件),我們不得不切換到奇怪的語法。 –

+0

您的代碼不會編譯,因爲它缺少import語句,'SomeOtherClass'聲明等。請提供一個MWE,最好不依賴於Eclipse庫。當我擴展您的代碼以添加缺少的部分時,它會使用'javac 1.8.0_131'爲我編譯,但是您的代碼或環境可能存在一些差異。 – mernst

回答

0

感謝Stephan Herrmann,我發現了這個問題。 javac版本使用在我們的META-INF/MANIFEST.MF文件中聲明的org.eclipse.jdt.annotation版本:1.1.0。但是這個版本是錯誤的,並且在使用Eclipse的編譯器時沒有捕獲到,因爲代碼是針對版本2.0.0(隨Eclipse Luna中的jdt提供的)編譯的。爲javac版本指定版本2.0.0解決了這個問題。

相關問題