3

和三个朋友一起,我正在用 gwt (2.6) 开发一个应用程序。几周前,我们开始使用超级开发模式。一切都很好,除了我们两个不能使用 ImageBundles。它始于我想包含一个 SuggestBox,它显然会加载一些图像。GWT 编译失败。我用谷歌搜索了很多,但我无法修复它,所以我开始做其他事情:使用 ImageResourceBundle 加载一些图像。GWT 编译失败。同样的错误。解决方法:不使用 ImageResourceBundle 加载图像。真正奇怪的是:我们中的两个人使用 Windows,一个使用 ubuntu,而我使用的是 mac。编译适用于 ubuntu 和其中一台 Windows 机器。在其他机器上,无论我们尝试什么,编译错误始终保持不变:

Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
   Computing all possible rebind results for 'com.google.gwt.user.client.ui.MenuBar.Resources'
      Rebinding com.google.gwt.user.client.ui.MenuBar.Resources
         Invoking generator com.google.gwt.resources.rebind.context.InlineClientBundleGenerator
            [ERROR] No @com.google.gwt.resources.ext.ResourceGeneratorType was specifed for type com.google.gwt.resources.client.ImageResource or its supertypes
   [ERROR] Errors in 'com/google/gwt/user/client/ui/MenuBar.java'
      [ERROR] Line 212: Failed to resolve 'com.google.gwt.user.client.ui.MenuBar.Resources' via deferred binding
   Computing all possible rebind results for 'com.google.gwt.user.client.ui.impl.ClippedImageImpl.Template'
      Rebinding com.google.gwt.user.client.ui.impl.ClippedImageImpl.Template
         Invoking generator com.google.gwt.safehtml.rebind.SafeHtmlTemplatesGenerator
            Constructing interface com.google.gwt.user.client.ui.impl.ClippedImageImpl.Template
               Generating method body for image()
                  [ERROR] Required annotation @Template not present on interface method public abstract com.google.gwt.safehtml.shared.SafeHtml image(com.google.gwt.safehtml.shared.SafeUri clearImage, com.google.gwt.safecss.shared.SafeStyles style)
   [ERROR] Errors in 'com/google/gwt/user/client/ui/impl/ClippedImageImpl.java'
      [ERROR] Line 104: Failed to resolve 'com.google.gwt.user.client.ui.impl.ClippedImageImpl.Template' via deferred binding
   Computing all possible rebind results for 'com.google.gwt.user.client.ui.impl.ClippedImageImpl.DraggableTemplate'
      Rebinding com.google.gwt.user.client.ui.impl.ClippedImageImpl.DraggableTemplate
         Invoking generator com.google.gwt.safehtml.rebind.SafeHtmlTemplatesGenerator
            Constructing interface com.google.gwt.user.client.ui.impl.ClippedImageImpl.DraggableTemplate
               Generating method body for image()
                  [ERROR] Required annotation @Template not present on interface method public abstract com.google.gwt.safehtml.shared.SafeHtml image(com.google.gwt.safehtml.shared.SafeUri clearImage, com.google.gwt.safecss.shared.SafeStyles style)
   [ERROR] Errors in 'com/google/gwt/user/client/ui/impl/ClippedImageImpl.java'
      [ERROR] Line 96: Failed to resolve 'com.google.gwt.user.client.ui.impl.ClippedImageImpl.DraggableTemplate' via deferred binding
[ERROR] Compiler returned false

我真的不知道该怎么办。我们检查了 eclipse 和 tomcat 中的几乎所有设置/配置文件。这都一样。有谁知道在哪里看?也许我在寻找错误的地方。我很感激你能给我的任何帮助。

附加信息(更新)

  • 使用 ant 构建应用程序时,gwt-compile 运行时不会出错。
  • 我们使用没有谷歌插件的eclipse。
  • 在开发模式下,Web 应用程序通过 tomcat7 启动。
  • 超级开发模式在 Web 应用程序中调用(在 Servlet.init() 中)。因此,我们必须将 gwt-dev jar 添加到 tomcat 启动器的类路径中。
  • 在我们的 gwt 源代码中包含new SuggestBox()任何地方都会导致某些机器上的 gwt-compile-error。没有new SuggestBox()一切都编译无处不在。

我认为这是一个类路径或 gwt-compile-sourcepath 问题。但是我们在我们使用的不同机器上没有看到任何差异。

4

3 回答 3

3

由于您没有包含任何代码,因此很难猜测可能出了什么问题,但这里有一些可能的原因:

零参数构造函数

这是我读过的文章中提到最多的一篇(参考文献如下),似乎正是你遇到的问题,但我不得不承认,我不知道为什么会发生这种情况只发生在你的一些队友身上(也许它只是在某些虚拟机或类似的东西下需要)。

这可能是一个延迟绑定问题(根据您发布的编译器日志),因此您应该检查您的所有 POJO(普通旧 java 对象)类是否具有用于延迟加载的零参数构造函数。

无法通过延迟绑定解析类

冲突的注释

也许您有一些注释放置错误,如此处所述:

使用 uibinder 延迟绑定失败的 GWT

@UiConstructor 和@UiFactory 之类的一些注解不能很好地结合在一起并且(即使在这种情况下它们实际上并不冲突)可能会导致类似的问题。

参考资料及更多

于 2014-07-24T09:28:28.093 回答
3

使用 ant 构建应用程序时,gwt-compile 运行时不会出错。

1)因此,如果您比较编译它的方式和 ant 编译它的方式,您将看到根本原因。

2)如果您没有看到任何区别,或者您不知道 Eclipse(或您使用的任何东西)如何编译您的应用程序,请尝试以这种方式编译它(我们可以称之为真正的纯 dzen 方式,没有任何 Eclipse、ant、 maven 或其他第三方“助手”):

java -cp gwt-dev.jar;gwt-user.jar;validation-api-1.0.0.GA.jar;validation-api-1.0.0.GA-sources.jar;any/other/lib.jar;path/to/your/module/source/code com.google.gwt.dev.Compiler moduleName

如果您的 .gwt.xml 描述符位于 com/your/gwt/module/MyModule.gwt.xml 下,您应该将com.your.gwt.module.MyModule其用作moduleName

于 2014-07-27T14:59:14.000 回答
0

如果你使用 Maven,你可以很容易地用 mvn compile 做一个 javac,然后你可以运行 mvn gwt:compile。这些讨厌的错误会消失。

于 2015-01-14T20:53:35.317 回答