2017-02-13 124 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。