java - 我可以在没有入口点的情况下强制进行 GWT 编译吗? (验证与 GWT 的兼容性)

标签 java gwt

此问题与 this question 相关,但不重复.

我的问题略有不同;我有一个“实用程序模块”,在客户端和服务器代码之间共享,它包含没有特定于 GWT 的代码

我知道通常情况下,所有源代码都被拉到一个特定的项目中,所有的东西都被编译在一起。但这有一个问题:只有在编译主项目时,我才能知道我的实用程序项目是否“兼容 GWT”。这太晚了;我什至还没抽出时间开始主要项目,但我想在向我的 SCM 做出“提交”之前知道,我的实用程序项目是“GWT 兼容的”。

换句话说,我想验证实用程序项目的 GWT 兼容性,独立于它在单独项目(模块)中的使用

GWT 未涵盖 JRE 的很大一部分,并且在实用程序模块中特别有可能使用与 GWT 不兼容的类或方法。这就是我要验证的内容。

编辑:我可以添加一个“虚拟入口点”,我想,但这使项目依赖于 GWT,我不想这样做,因为它是“通用”代码,也可供不使用 GWT 的人使用。如果重要的话,我会使用 Maven 作为构建系统。

EDIT2:无论我做什么,我只会通过入口点(不需要引用任何类)获得真正的编译/验证。 truetrue 都不会。有没有一种方法可以为共享项目定义入口点,这样只有 gwt-maven-plugin 可以看到它,而 javac 看不到(以免在 Java 代码中添加不需要的依赖项)?

最佳答案

编译器实际上总是访问源路径上的所有代码(注意:与类路径不完全相同),方法是从带有任何 <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/

相关文章:

java - Eclipse 的 Google 插件安装错误

部署时的 GWT 日志文件

gwt - 对您没有代码的外部服务进行 GWT RPC 调用

java - 使用 Collections.shuffle() 计算给定数字集合的一百万个不同排列?

java - 将 Apache Spark 添加到 Eclipse Maven 项目时出现问题

java - 如何重新绘制 JPanel

java - 如何从智能 gwt 日历中删除下午/上午

java - 在 Java 中格式化打印对的输出?

java - 使用规范按父实体排序

html - 具有可滚动内容的 GXT MessageBox