Компиляция GWT не выполняется при использовании maven, но не eclipse - NoSuchMethodError UiBinderWriter. ‹Init›

Я столкнулся с исключительной ситуацией при компиляции проекта GWT с использованием maven, но он работает в eclipse. Я провел последние несколько часов в поиске в Google и StackOverflow, но хотя пара результатов была актуальной, ни один из них не подходил для моей ситуации.

Среда:

  • OSX 10.10.1
  • Java 1.7.0_67 64 бит
  • GWT 2.7.0
  • GWTP 1.3.1
  • GAE 1.9.17
  • Maven 3.2.3

Я могу запустить проект в eclipse, используя режим Super Dev Mode, и он отлично работает. Я могу использовать плагин Eclipse GWT для компиляции проекта - он успешно завершается. Но если я попытаюсь скомпилировать через терминал, используя mvn clean compile gwt:compile, я получаю следующую ошибку:

[INFO] Compiling module com.example.foo.Foo
[INFO]    [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:121)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:296)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:128)
[INFO]  at com.google.gwt.dev.jjs.ast.JDeclarationStatement.traverse(JDeclarationStatement.java:49)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor$ListContext.traverse(JModVisitor.java:95)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemove(JModVisitor.java:351)
[INFO]  at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:92)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:149)
[INFO]  at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:145)
[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:381)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:600)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:569)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:285)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:1505)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:870)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler$Precompiler.unifyJavaAst(JavaToJavaScriptCompiler.java:1305)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler$Precompiler.constructJavaAst(JavaToJavaScriptCompiler.java:1038)
[INFO]  at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler$Precompiler.precompile(JavaToJavaScriptCompiler.java:954)
[INFO]  at com.google.gwt.dev.jjs.MonolithicJavaToJavaScriptCompiler.precompile(MonolithicJavaToJavaScriptCompiler.java:303)
[INFO]  at com.google.gwt.dev.jjs.JavaScriptCompiler.precompile(JavaScriptCompiler.java:38)
[INFO]  at com.google.gwt.dev.Precompile.precompile(Precompile.java:286)
[INFO]  at com.google.gwt.dev.Precompile.precompile(Precompile.java:229)
[INFO]  at com.google.gwt.dev.Precompile.precompile(Precompile.java:145)
[INFO]  at com.google.gwt.dev.Compiler.run(Compiler.java:206)
[INFO]  at com.google.gwt.dev.Compiler.run(Compiler.java:158)
[INFO]  at com.google.gwt.dev.Compiler$1.run(Compiler.java:120)
[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:127)
[INFO] Caused by: java.lang.NoSuchMethodError: com.google.gwt.uibinder.rebind.UiBinderWriter.<init>(Lcom/google/gwt/core/ext/typeinfo/JClassType;Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/ext/typeinfo/TypeOracle;Lcom/google/gwt/uibinder/rebind/MortalLogger;Lcom/google/gwt/uibinder/rebind/FieldManager;Lcom/google/gwt/uibinder/rebind/messages/MessagesWriter;Lcom/google/gwt/uibinder/rebind/DesignTimeUtils;Lcom/google/gwt/uibinder/rebind/UiBinderContext;ZZLjava/lang/String;)V
[INFO]  at com.google.gwt.uibinder.rebind.UiBinderGenerator.generateOnce(UiBinderGenerator.java:187)
[INFO]  at com.google.gwt.uibinder.rebind.UiBinderGenerator.generate(UiBinderGenerator.java:135)
[INFO]  at com.google.gwt.core.ext.IncrementalGenerator.generateNonIncrementally(IncrementalGenerator.java:40)
[INFO]  at com.google.gwt.dev.javac.StandardGeneratorContext.runGeneratorIncrementally(StandardGeneratorContext.java:760)
[INFO]  at com.google.gwt.dev.cfg.RuleGenerateWith.realize(RuleGenerateWith.java:160)
[INFO]  at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind(StandardRebindOracle.java:79)
[INFO]  at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:276)
[INFO]  at com.google.gwt.dev.shell.StandardRebindOracle.rebind(StandardRebindOracle.java:265)
[INFO]  at com.google.gwt.dev.DistillerRebindPermutationOracle.getAllPossibleRebindAnswers(DistillerRebindPermutationOracle.java:87)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.createStaticRebindExpression(UnifyAst.java:485)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.createRebindExpression(UnifyAst.java:443)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.handleMagicMethodCall(UnifyAst.java:576)
[INFO]  at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.endVisit(UnifyAst.java:306)
[INFO]  at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:248)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:381)
[INFO]  at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:293)
[INFO]  ... 35 more
[INFO]       [ERROR] at com_gwtplatform_mvp_client_DesktopGinjector_DesktopGinjectorGinjector_fragment.java(91): GWT.create(ApplicationView$Binder.class)
[INFO]          com.google.gwt.dev.jjs.ast.JMethodCall
[INFO]       [ERROR] at com_gwtplatform_mvp_client_DesktopGinjector_DesktopGinjectorGinjector_fragment.java(91): Object created = GWT.create(ApplicationView$Binder.class)
[INFO]          com.google.gwt.dev.jjs.ast.JDeclarationStatement
[INFO]       [ERROR] at com_gwtplatform_mvp_client_DesktopGinjector_DesktopGinjectorGinjector_fragment.java(90): {
[INFO]   Object created = GWT.create(ApplicationView$Binder.class);
[INFO]   assert created instanceof ApplicationView$Binder;
[INFO]   ApplicationView$Binder result = (ApplicationView$Binder) created;
[INFO]   this.memberInject_Key$type$com$example$foo$client$application$ApplicationView$Binder$_annotation$$none$$(result);
[INFO]   return result;
[INFO] }
[INFO]          com.google.gwt.dev.jjs.ast.JBlock
[INFO]       [ERROR] at com_gwtplatform_mvp_client_DesktopGinjector_DesktopGinjectorGinjector_fragment.java(90): {
[INFO]   Object created = GWT.create(ApplicationView$Binder.class);
[INFO]   assert created instanceof ApplicationView$Binder;
[INFO]   ApplicationView$Binder result = (ApplicationView$Binder) created;
[INFO]   this.memberInject_Key$type$com$example$foo$client$application$ApplicationView$Binder$_annotation$$none$$(result);
[INFO]   return result;
[INFO] }
[INFO]          com.google.gwt.dev.jjs.ast.JMethodBody
[INFO]       [ERROR] at com_gwtplatform_mvp_client_DesktopGinjector_DesktopGinjectorGinjector_fragment.java(90): public ApplicationView$Binder get_Key$type$com$example$foo$client$application$ApplicationView$Binder$_annotation$$none$$();
[INFO] 
[INFO]          com.google.gwt.dev.jjs.ast.JMethod
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.013 s
[INFO] Finished at: 2014-12-06T20:28:36-05:00
[INFO] Final Memory: 13M/310M
[INFO] ------------------------------------------------------------------------

Я использовал плагин GWTP для создания базового проекта для использования в Google App Engine, и мне пришлось настроить ряд вещей, чтобы получить его, чтобы он работал локально и передавался в движок приложения. Он отлично компилировался в то время, eclipse или maven. Я сделал еще несколько модификаций, в основном возился с пользовательским интерфейсом и журналом GWT, все время тестируя в режиме Super Dev Mode, и он работал нормально. теперь работает нормально. Поскольку это не было сделано, я не пытался загружать в GAE.

Исследовать:

Один из них связан с унаследованные модули, которые переопределяли реализацию GWT UIBinder, но я не добавил никаких наследований или зависимостей от архетипа, который я использовал для его создания. Плюс работает через eclipse / SuperDevMode. другой был о том, чтобы заставить компиляцию работать в eclipse, и я, возможно, использовал его, чтобы заставить работать eclipse, когда я впервые работал над проектом неделю назад. Но он работает в eclipse, но не через командную строку maven.

Я пытался удалить различные модули, которые не требуются для gwt / gwtp, и мне не повезло. Я указал версию импорта gwt-user и gwt-dev, ничего. Я всегда получаю одну и ту же ошибку, и это сводит меня с ума! Я просто не могу понять, почему он не компилируется с «нормальным» maven.


person Clay H    schedule 07.12.2014    source источник
comment
Если какая-то зависимость затеняет класс com.google.gwt.uibinder.rebind.UiBinderWriter, значит, это проблема упорядочивания пути к классам. Либо вы изменили версию Maven, и она по-другому упорядочивает зависимости, либо вы изменили порядок объявления зависимостей в своем pom.xml. Попробуйте использовать открытый тип в Eclipse, чтобы найти зависимость, которая содержит оскорбительный устаревший класс, и попробуйте обновить эту зависимость с помощью той, которая совместима с GWT 2.7 (и / или изменить порядок вашего POM)   -  person Thomas Broyer    schedule 07.12.2014
comment
Вы были правы - это был порядок зависимости. Я не помню, чтобы менял это, но я исправил это, переупорядочив зависимости. А именно, я переместил gwt-user в начало списка, и проблема исчезла. Благодарность!   -  person Clay H    schedule 09.12.2014


Ответы (2)


GWTP переопределяет UiBinderGenerator, чтобы позволить Gin работать с UiBinder. Измените версию GWTP на 1.4-SNAPSHOT (1.4 должна быть выпущена очень скоро!), Это должно решить проблему, поскольку мы переместили UiBinderGenerator в расширение вместо того, чтобы быть частью ядра MVP. Причина, по которой он работает с Eclipse, вероятно, связана с упорядочением путей к классам, как указал Томас Бройер.

person meriouma    schedule 08.12.2014
comment
В данном случае это не было связано с GWTP, но на это определенно стоит обратить внимание. - person Clay H; 09.12.2014

Проблема заключалась в том, что одна из других моих зависимостей «затеняла» нужный мне UIBinder, как указал Томас-Бройер. Я не уверен, когда это изменилось, я не помню, чтобы перемещались какие-либо зависимости. Возможно, это была транзитивная зависимость. В любом случае я решил это ...

Добавление / перемещение зависимости gwt-user в начало списка. Задача решена!

person Clay H    schedule 09.12.2014