GWT编译错误,图像和延迟绑定

时间:2014-07-21 12:31:41

标签: eclipse tomcat gwt gwt-super-dev-mode

有三个朋友,我正在使用gwt(2.6)开发一个应用程序。几周前,我们开始使用超级开发模式。一切都很好,除了我们两个人不能使用ImageBundles。它开始时我想要包含一个SuggestBox,它显然加载了一些图像。 GWT编译失败。我google了很多,我无法解决它,所以我开始研究其他东西:使用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 WITHOUT google plugins。
  • 在开发模式下,Web应用程序通过tomcat7启动。
  • 在Web应用程序中调用super-dev-mode(在Servlet.init()中)。因此,我们必须将gwt-dev jar添加到tomcat启动器的类路径中。
  • 在我们的gwt源代码中包含new SuggestBox()会导致某些机器上出现gwt-compile-error。没有new SuggestBox(),一切都在无处编译。

我认为这是一个classpath或gwt-compile-sourcepath问题。但我们发现在我们使用的不同机器上没有差异。

3 个答案:

答案 0 :(得分:3)

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

零参数构造函数

这是我在阅读的文章(下面的参考文献)中提到的最多的一个,似乎正好创造了你所拥有的问题,但我不得不承认我不知道为什么会发生这种情况<你的队友的一些(可能只是在某些虚拟机或类似的东西下需要)。

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

Failed to resolve class via deferred binding

注释冲突

也许你有一些错误的注释,如下所述:

Deferred binding failed GWT using uibinder

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

参考文献&amp;更多

答案 1 :(得分:3)

  

使用ant构建应用程序时,gwt-compile运行时没有错误。

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

2)如果您没有看到任何差异,或者您不知道Eclipse(或您使用的任何东西)如何编译您的应用程序,请尝试以这种方式编译它(我们可以称之为真正纯粹的方式没有任何日食,蚂蚁,专家或其他第三方“助手”):

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

答案 2 :(得分:0)

如果您正在使用Maven,您可以轻松地使用mvn编译执行javac,然后您可以运行mvn gwt:compile。这些讨厌的错误将会消失。