2017-02-13 160 views
1

我想了解更多關於GWT編譯如何工作。GWT編譯器:什麼時候編譯錯誤是致命的?

更具體地說,我想知道GWT如何決定一個特定的錯誤是致命的,並且應用程序編譯應該因爲它而失敗,以及它如何決定編譯成功,即使存在編譯錯誤。

我問的原因是,在進行搜索時,我很難區分日誌中的合法錯誤,而這些錯誤似乎不會導致任何問題。

我在談論GWT 2.7和GWT 2.8(我已經看到它們表現出相同的行爲)。 此外,我使用GWTP 1.5.3,如果這是相關的一些。

一個具體的例子:我有這樣的錯誤在我的日誌:

Tracing compile failure path for type 'myApp.ClientModule' 
Errors in 'file:/E:/data/.../myApp/ClientModule.java' 
    Line 24: No source code is available for type myApp.client.ServicesProvidersModuleGen; did you forget to inherit a required module? 
Checked 1 dependencies for errors. 

上述錯誤不會使我的應用程序失敗的編譯和對myApp工作得很好(類的東西,註冊一些GIN綁定,這也起作用)。

爲什麼GWT在遇到錯誤時不能編譯失敗?

此外,我也有其他的錯誤,如:

Errors in 'com/google/gwt/validation/client/impl/AbstractGwtSpecificValidator.java' 
Line 102: No source code is available for type javax.validation.ValidationException; did you forget to inherit a required module? 
Line 177: No source code is available for type javax.validation.ConstraintValidator<A,T>; did you forget to inherit a required module? 
Line 153: No source code is available for type javax.validation.groups.Default; did you forget to inherit a required module? 
Line 302: No source code is available for type javax.validation.ConstraintViolation<T>; did you forget to inherit a required module? 

這些錯誤也沒有辜負我的編譯。爲什麼?

編輯1:忘了補充。

我很想知道,如果錯誤是從某個入口點直接到達的東西,編譯失敗,並且該代碼無法訪問時編譯正常。 但是,我有帶註釋的代碼的反例。 我有從入口點到達的代碼,並且有註釋的源代碼不可用,但編譯成功(儘管這是迄今唯一可以找到的異常)。

回答

3

你的分析很好。

GWT將掃描整個類路徑,忽略不在源路徑中的所有內容以及「重新綁定」超級源。在掃描過程中,它會發出你所看到的那種錯誤,但是隻有當代碼到達缺少的源(從入口點)時,錯誤纔會變成致命的。註釋也不例外,但代碼將永遠不會實際到達它們作爲他們的正義元數據(除非您實現了允許的@interface)。發電機雖然可以使用註解,但在這種情況下,他們可以通過失敗。

請注意,如果您使用-failOnError(或-strict,這是一個別名),則所有錯誤都是致命的。你應該瞄準把這個變成IMO。