GWT JSNI项目中的DevMode启动失败

GWT JSNI项目中的DevMode启动失败,gwt,jsni,gwt-super-dev-mode,dev-mode,Gwt,Jsni,Gwt Super Dev Mode,Dev Mode,我在gwt开发模式调试中遇到了一个奇怪的问题 下面是我正在编写的JSNI包装 这是一个相当小且简单的项目,包含大量JSNI、JavaScriptObject和JSON代码。它覆盖了流行的amcharts图表库。在SuperDevMode和生产环境中调试时,它运行良好 但是,我无法使用开发模式调试在Internet Explorer中调试项目 java.lang.ClassFormatError:类文件com/google/gwt/core/client/JavaScriptObject$中存在重

我在gwt开发模式调试中遇到了一个奇怪的问题

下面是我正在编写的JSNI包装

这是一个相当小且简单的项目,包含大量JSNI、JavaScriptObject和JSON代码。它覆盖了流行的amcharts图表库。在SuperDevMode和生产环境中调试时,它运行良好

但是,我无法使用开发模式调试在Internet Explorer中调试项目

java.lang.ClassFormatError:类文件com/google/gwt/core/client/JavaScriptObject$中存在重复的方法名和签名

抛出的主要异常并没有帮助我判断代码的哪一部分正在被破坏


当使用JSNI时,这在开发模式下发生。由于超级开发模式使用纯java脚本直接在浏览器中进行调试,所以没有严格的类型转换,也不会产生错误。在开发模式下,java代码运行,由于严格的类型转换,您将得到类格式异常。没有用。海图也有同样的问题。如果它在生产和超级开发模式下运行良好,那么您不必担心它。希望有帮助。

有问题的类是
AmChartJSO
实现
IsAmChart
接口-所有方法在
JavaScriptObject$
中声明了两次。字节码的片段:

public final synthetic com_amcharts_api_IsAmChart_setVersion(Ljava/lang/String;)V
  ALOAD 0
  ALOAD 1
  INVOKESTATIC com/amcharts/jso/AmChartJSO$.setVersion$ (Lcom/amcharts/jso/AmChartJSO;Ljava/lang/String;)V
  RETURN
  MAXSTACK = 2
  MAXLOCALS = 2

// access flags 0x1011
public final synthetic com_amcharts_api_IsAmChart_setVersion(Ljava/lang/String;)V
  ALOAD 0
  ALOAD 1
  INVOKESTATIC com/amcharts/jso/AmChartJSO$.setVersion$ (Lcom/amcharts/jso/AmChartJSO;Ljava/lang/String;)V
  RETURN
  MAXSTACK = 2
  MAXLOCALS = 2
似乎您遇到了覆盖类型的限制-:

实际上,这意味着只有一种JavaScriptObject类型可以实现任何给定的接口,但任何数量的非JavaScriptObject类型也可以实现该接口

看看你的代码,这个限制被打破了:
AmChartJSO
实现了
IsAmChart
,但是
AmCoordinateChartJSO
实现了
IsAmCoordinateChart
,它扩展了
IsAmChart
,因此两个JSO实现了相同的接口。如果我正确理解这个限制,您甚至不能为实现接口的JSO子类化

我做了一个快速测试,这段代码也失败了:

公共类测试扩展JavaScriptObject实现TakesValue{
受保护测试(){
}
@凌驾
公共最终无效设置值(字符串值){
}
@凌驾
公共最终字符串getValue(){
返回null;
}
}
公共类Test2扩展了Test{
受保护的Test2(){
}
}
除了一个同样无用的例外:

java.lang.NullPointerException: null
    at com.google.gwt.dev.shell.CompilingClassLoader$MySingleJsoImplData.findOverloadUsingErasure(CompilingClassLoader.java:703)
    at com.google.gwt.dev.shell.CompilingClassLoader$MySingleJsoImplData.<init>(CompilingClassLoader.java:593)
    at com.google.gwt.dev.shell.CompilingClassLoader.<init>(CompilingClassLoader.java:980)
    at com.google.gwt.dev.shell.ShellModuleSpaceHost.onModuleReady(ShellModuleSpaceHost.java:137)
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:340)
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException:null
在com.google.gwt.dev.shell.CompilingClassLoader$MySingleJsoImplData.findOverloadUsingErasure(CompilingClassLoader.java:703)
在com.google.gwt.dev.shell.compilengclassloader$MySingleJsoImplData上。(compilengclassloader.java:593)
在com.google.gwt.dev.shell.CompilingClassLoader.(CompilingClassLoader.java:980)
位于com.google.gwt.dev.shell.ShellModuleSpaceHost.onModuleReady(ShellModuleSpaceHost.java:137)
位于com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:340)
位于com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
位于com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526)
在com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
运行(Thread.java:745)
有关此问题的解决方法和一般性讨论,请参阅


自己转储生成的类文件 为了便于将来参考,您可以通过设置
gwt.dev.classDump
系统属性(
-Dgwt.dev.classDump=true
)来转储生成的
class
字段。有关更多信息,请参阅。默认情况下,类将写入
重写类
文件夹(在您的情况下,它将是
war/重写类
)。这些类是按包组织的,因此查找
JavaScriptObject$
很容易:
重写类/com/google/gwt/core/client/JavaScriptObject$.class

现在,您需要做的就是反汇编它-我已经使用了,并获得了
JavaScriptObject$.class
的字节码


为了找出复制了哪些方法,我可以用类加载器加载
文件,然后让JVM找出它。。。但是我觉得自己很懒,所以我在字节码中对
public-final-synthetic
进行了
grep
ed,并运行以仅查看重复的条目。

调试是否与Mozilla Firefox一起工作?给Mozilla一个机会。@Mayillan:在Firefox 26.0上试用过。同样的问题。@thomas broyer有没有办法找出javascript对象的哪段代码被破坏了?需要它来确保GWT开发模式调试,因为超级开发模式不可能用于大型项目。因为Chrome和Firefox已经放弃了开发模式。我们被迫使用IE9/11进行调试。奇妙的解释。知道了。您是否建议清理接口层次结构或彻底检查我对客户端jso和impl软件包所采取的方法。想知道我最初对SuperDevMode和生产模式功能的假设是否有误。在超级开发模式启动时,开发模式不会启动,并且会使用此设计运行!!!!!是的,SDM使用这种设计非常有趣,而经典的DevMode不使用。也许是虫子?还是倒退?提交错误报告可能是值得的——至少他们可以改进抛出的错误;)至于整体设计——它肯定需要大修,因为即使您现在理解了限制,一个新的开发人员尝试扩展您的库可能不会也很容易遇到相同的问题。链接线程中有一些很有希望的想法,您可以尝试。通过删除由AmChart子类反复实现的IJavaScriptWrapper来解决问题。接受答案,因为它为我指明了正确的方向。解决方案不需要我重新访问JSO层次结构。
java.lang.NullPointerException: null
    at com.google.gwt.dev.shell.CompilingClassLoader$MySingleJsoImplData.findOverloadUsingErasure(CompilingClassLoader.java:703)
    at com.google.gwt.dev.shell.CompilingClassLoader$MySingleJsoImplData.<init>(CompilingClassLoader.java:593)
    at com.google.gwt.dev.shell.CompilingClassLoader.<init>(CompilingClassLoader.java:980)
    at com.google.gwt.dev.shell.ShellModuleSpaceHost.onModuleReady(ShellModuleSpaceHost.java:137)
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:340)
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
    at java.lang.Thread.run(Thread.java:745)