【问题标题】:Can I force GWT compilation without entry point? (To validate compatibility to GWT)我可以在没有入口点的情况下强制 GWT 编译吗? (验证与 GWT 的兼容性)
【发布时间】:2014-03-30 18:34:18
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: java gwt


    【解决方案1】:

    编译器实际上总是访问源路径上的所有代码(注意:与类路径不完全相同),从带有任何<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 被传递给生成器,生成器需要能够提出诸如“源路径上的哪些接口具有 JSO 实现”和“List 的所有可能子类是什么”之类的问题。生成器可以做很多事情,包括发出更多类型,然后需要对其进行解析、编译,并且该过程会继续进行,直到根据当前模块集创建所有可能类型的完整 JProgram。

    然后,JProgram 会根据可以从根(入口点)以及其他一些细节(例如如何模拟强制转换、数组、长整数、异常等)等 Java 细节来编译。

    如果没有指定-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
    

    【讨论】:

    • -strict 标志的问题在于,即使 GWT 不使用代码,它也会显示验证错误,这违背了 OP 的目的。当然,除非他愿意手动检查每个错误并决定如何处理。
    • 无论哪种情况,感谢您的详细解释。
    • @AndreiVolgin 我明白你的意思,但是一个独立的模块不知道未来的模块是否需要它自己的某些不兼容部分,所以没有办法允许 一些不兼容,但不知道需要什么。如果我让你填10个框,但只选了3个,你只填了一些,不知道我会选哪个,你怎么填对?一般来说,在这种情况下,我宁愿所有标记为客户端兼容的代码实际上都是客户端兼容的,无论是否需要,因为我可能有一天会尝试使用它。
    • 同意。我还保持我的共享代码 100% GWT 兼容。
    • 现在看 Edit2,是的,看起来您正在使用 maven,这遇到了我在帖子中描述的问题。有一些解决方法:添加一个什么都不做的虚拟入口点,使一个虚拟模块成为一个入口点,仅用于测试以保持真实模块的清洁,或使用exec-maven-plugin:exec 目标使用您想要的任何参数运行com.google.gwt.dev.Compiler 主类。如果您需要更多信息,请告诉我,我可以添加到答案中。
    【解决方案2】:

    我认为这不可能,因为 GWT 编译器不会编译任何未使用的代码。

    这意味着您的共享实用程序“模块”中可能包含与 GWT 不兼容的代码,但只要 GWT 代码从不调用此类不兼容的类或方法,它就不会导致任何问题。如果没有入口点,GWT 编译器将不知道使用了哪些代码,哪些未使用 - 它会假定所有代码都未使用。

    【讨论】:

    • 所以,即使我添加了一个“虚拟”入口点,GWT 仍然不会编译我的代码,因为它没有被引用,甚至没有从入口点间接引用,对吧?如果是这样,那么我想真的没有办法强制代码验证。
    • 正确。但是,您可以创建一个虚拟入口点来引用您想要验证的所有类/方法。这几乎就像编写单元测试一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多