首页 > 解决方案 > GWT:如何从 gwt 2.7.0 迁移到 gwt 2.8.2

问题描述

我在 gwt 2.7.0 上遇到了这个问题:Datepicker 没有锚定到 Chrome 中的 DateBox。我尝试升级到 gwt 2.8.2,但是当我尝试编译代码时出现此异常:

[ERROR] An internal compiler exception occurred
[INFO] com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:111)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:276)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
[INFO]  at com.google.gwt.dev.jjs.ast.JCastOperation.traverse(JCastOperation.java:76)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
[INFO]  at com.google.gwt.dev.jjs.ast.JCastOperation.traverse(JCastOperation.java:76)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.acceptImmutable(JModVisitor.java:305)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethodCall.visitChildren(JMethodCall.java:275)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:266)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:118)
[INFO]  at com.google.gwt.dev.jjs.ast.JExpressionStatement.traverse(JExpressionStatement.java:42)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331)
[INFO]  at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:94)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139)
[INFO]  at com.google.gwt.dev.jjs.ast.JIfStatement.traverse(JIfStatement.java:53)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:88)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:331)
[INFO]  at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:94)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:139)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:135)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:83)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:786)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:778)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:1401)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:896)
[INFO]  at 
com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.unifyJavaAst(JavaToJavaScriptCompiler.java:1410)
[INFO]  at 
com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.constructJavaAst(JavaToJavaScriptCompiler.java:1222)
[INFO]  at 
com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:1140)
[INFO]  at 
com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:255)
[INFO]  at com.google.gwt.dev.Precompile.precompile(Precompile.java:255)
[INFO]  at com.google.gwt.dev.Precompile.precompile(Precompile.java:202)
[INFO]  at com.google.gwt.dev.Precompile.precompile(Precompile.java:143)
[INFO]  at com.google.gwt.dev.Compiler.compile(Compiler.java:204)
[INFO]  at com.google.gwt.dev.Compiler.compile(Compiler.java:155)
[INFO]  at com.google.gwt.dev.Compiler.compile(Compiler.java:144)
[INFO]  at com.google.gwt.dev.Compiler$1.run(Compiler.java:118)
[INFO]  at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:55)
[INFO]  at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:50)
[INFO]  at com.google.gwt.dev.Compiler.main(Compiler.java:125)
[INFO] Caused by: java.lang.NoSuchMethodError: 
com.google.gwt.core.ext.typeinfo.JClassType.getMetaDataTags()[Ljava/lang/String;
[INFO]  at org.googlecode.gwt.rebind.menu.ClassMenuGenerator.elabClass(ClassMenuGenerator.java:237)
[INFO]  at org.googlecode.gwt.rebind.menu.ClassMenuGenerator.create(ClassMenuGenerator.java:204)
[INFO]  at org.googlecode.gwt.rebind.menu.MenuGenerator.generate(MenuGenerator.java:14)
[INFO]  at 
com.google.gwt.core.ext.IncrementalGenerator.generateNonIncrementally(IncrementalGenerator.java:40)
[INFO]  at com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:103)
[INFO]  at 
com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:78)
[INFO]  at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:262)
[INFO]  at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:251)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
[INFO]  ... 56 more
[INFO]       [ERROR] at Cdn.java(343): GWT.create(CdnMenu.class)
[INFO]          com.google.gwt.dev.jjs.ast.JMethodCall
[INFO]       [ERROR] at Cdn.java(343): (SMenu) GWT.create(CdnMenu.class)
[INFO]          com.google.gwt.dev.jjs.ast.JCastOperation
[INFO]       [ERROR] at Cdn.java(343): (SMenu) (SMenu) GWT.create(CdnMenu.class)
[INFO]          com.google.gwt.dev.jjs.ast.JCastOperation
[INFO]       [ERROR] at Cdn.java(343): TemplateManager.setMenu((SMenu) (SMenu) 
GWT.create(CdnMenu.class))
[INFO]          com.google.gwt.dev.jjs.ast.JMethodCall
[INFO]       [ERROR] at Cdn.java(343): TemplateManager.setMenu((SMenu) (SMenu) 
GWT.create(CdnMenu.class))
[INFO]          com.google.gwt.dev.jjs.ast.JExpressionStatement
[INFO]       [ERROR] at Cdn.java(165):

这是出错的行之一:
TemplateManager.setMenu((SMenu) GWT.create(CdnMenu.class));

有任何想法吗?在此先感谢斯特凡诺

标签: gwt

解决方案


[INFO] Caused by: java.lang.NoSuchMethodError: 
com.google.gwt.core.ext.typeinfo.JClassType.getMetaDataTags()[Ljava/lang/String;
[INFO]  at org.googlecode.gwt.rebind.menu.ClassMenuGenerator.elabClass(ClassMenuGenerator.java:237)
[INFO]  at org.googlecode.gwt.rebind.menu.ClassMenuGenerator.create(ClassMenuGenerator.java:204)
[INFO]  at org.googlecode.gwt.rebind.menu.MenuGenerator.generate(MenuGenerator.java:14)

看起来您的项目有一些正在使用的 MenuGenerator,它正在调用 JClassType.getMetaDataTags,该方法似乎不再存在。此方法存在于一个接口上,该接口于 2014 年HasMetadata被删除,但在 12 年前的 2009 年被弃用- 到那时它不再起作用(根据提交消息)。


在网上搜索 ClassMenuGenerator 的完整类名(和包结构)表明它是该项目的一部分,该项目以前托管在 Google Code 上,在该服务关闭时存档:Productive GWT。那些项目可以迁移到 github,但我只发现发生了一个这样的迁移,即使在那个副本中,这个问题也没有得到修复——fork 可能没有维护。

好消息是修复它应该很容易,因为如上所述,元数据功能自 2009 年以来实际上没有做任何事情,因此您可能只需 fork 并删除调用这些元数据方法的代码。针对最新版本的 GWT 编译项目还可以更容易地确定是否还有其他潜伏的问题也可能导致问题。


推荐阅读