此问题与 this question 相关,但不重复.
我的问题略有不同;我有一个“实用程序模块”,在客户端和服务器代码之间共享,它包含没有特定于 GWT 的代码。
我知道通常情况下,所有源代码都被拉到一个特定的项目中,所有的东西都被编译在一起。但这有一个问题:只有在编译主项目时,我才能知道我的实用程序项目是否“兼容 GWT”。这太晚了;我什至还没抽出时间开始主要项目,但我想在向我的 SCM 做出“提交”之前知道,我的实用程序项目是“GWT 兼容的”。
换句话说,我想验证实用程序项目的 GWT 兼容性,独立于它在单独项目(模块)中的使用。
GWT 未涵盖 JRE 的很大一部分,并且在实用程序模块中特别有可能使用与 GWT 不兼容的类或方法。这就是我要验证的内容。
编辑:我可以添加一个“虚拟入口点”,我想,但这使项目依赖于 GWT,我不想这样做,因为它是“通用”代码,也可供不使用 GWT 的人使用。如果重要的话,我会使用 Maven 作为构建系统。
EDIT2:无论我做什么,我只会通过入口点(不需要引用任何类)获得真正的编译/验证。
最佳答案
编译器实际上总是访问源路径上的所有代码(注意:与类路径不完全相同),方法是从带有任何 <source>
的请求模块开始标签,然后检查每个 <inherits>
一路上。如果它发现不兼容或不可编译的东西,它会将其标记为已损坏,然后继续 - 只要没有任何东西真正依赖它(即 EntryPoint 或 EntryPoint 所依赖的东西)你就会只看到这条消息:
Validating newly compiled units
Ignored 1 unit with compilation errors in first pass.
Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
如果您包括 -strict
标志,编译实际上会在遇到无法正确包含的内容时失败。
这项工作是在编译的早期阶段完成的,在构建用于生成器的 TypeOracle 时,远远早于构建任何 JS。该类型的 oracle 被传递给生成器,生成器需要能够提出诸如“sourcepath 上的哪些接口(interface)具有 JSO 实现”和“List 的所有可能子类是什么”之类的问题。生成器可以做很多事情,包括发出更多类型,然后需要对其进行解析、编译,然后继续该过程,直到根据当前模块集创建包含所有可能类型的完整 JProgram。
然后根据从根可以到达的内容(入口点)以及一些其他细节(例如如何模拟 Java 细节,如强制转换、数组、长整型、异常等)对该 JProgram 进行编译。
如果-strict
未指定,并且编译器最终需要达到由于早期编译问题而无法使用的内容,这就是您发现的时间。使用 -strict
提前停止将有助于确保您更快地发现这些问题。
还有一个有趣的事实:默认情况下,com.google.gwt.user.User
在你的模块(或依赖于它的任何其他 <inherits>
)中,你已经有一个或多个入口点!这些会快速检查您的页面是否正常工作,例如使用严格的文档类型,或者浏览器实际匹配预期的 user.agent
环境。这意味着即使没有入口点,通常也可以编译模块(使用 gwt-maven-plugin:compile
除外,它不会考虑仅通过那些内置模块进行编译的模块)。
编辑:好的,还有一个:来自http://www.gwtproject.org/doc/latest/DevGuideCompilingAndDebugging.html , 结合 -strict
,看起来您可以强制运行验证而无需实际编译为 JS:
-validateOnly Validate all source code, but do not compile
关于java - 我可以在没有入口点的情况下强制进行 GWT 编译吗? (验证与 GWT 的兼容性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748071/