我正在尝试更多地了解 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 绑定(bind),这也可以工作)。
为什么 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:忘记添加。
我很想猜测,当错误出现在可从入口点直接访问的内容中时,编译会失败,而当该代码不可访问时,编译会正常。 但是,我有带注释的代码的反例。 我有可以从入口点访问的代码,并且有源代码不可用的注释,但编译成功(尽管这是迄今为止我能找到的唯一异常(exception))。
最佳答案
你的分析很好。
GWT 将扫描整个类路径,忽略源路径中没有的所有内容并“重新设置” super 源。在该扫描期间,它会发出您看到的那种错误,但只有当代码到达丢失的源(从入口点)时,错误才会变得致命。注释也不异常(exception),但代码永远不会真正将它们作为元数据(除非您实现 Java 允许的 @interface
)。不过,注释可以被生成器使用,在这种情况下,它们可能使构建失败。
请注意,如果您使用-failOnError
(或-strict
,这是一个别名),那么所有错误都是致命的。在我看来,你应该致力于将其打开。
关于java - GWT编译器: when is a compilation error fatal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42209196/