Vaadin 8.10.1集成grid-renderers-collection-addon时Widgetset编译失败求助
Vaadin 8.10.1 Widgetset编译失败问题排查
背景信息
我们在Vaadin 8.10.1项目中为Grid配置CheckboxRenderer,添加了如下依赖:
<dependency> <groupId>com.vaadin</groupId> <artifactId>grid-renderers-collection-addon</artifactId> <version>2.7.0</version> </dependency>
该版本与Vaadin 8.10.1兼容。
Grid相关代码实现:
Setter<Payment, Boolean> setter = new Setter<Payment, Boolean>() { @Override public void accept(Payment s, Boolean aBoolean) { } }; CheckboxRenderer renderer = new CheckboxRenderer(setter); paymentGrid.addColumn(Payment::getSelectedToMultiAction).setRenderer(renderer).setCaption(""); renderer.addClickListener(event -> { Payment toBeAdded = (Payment) event.getItem(); if (toBeAdded.getSelectedToMultiAction()) { selectedPayments.add(toBeAdded); } else { selectedPayments.remove(toBeAdded); } });
Widgetset配置:
@SpringUI @Theme("valo-ps") @Widgetset("com.vaadin.v7.Vaadin7WidgetSet") @StyleSheet({"https://fonts.googleapis.com/css?family=Roboto"})
使用gwt-dev版本2.8.2,执行vaadin-maven-plugin:8.10.1:compile命令时,发现多个widgetset:
[INFO] Widgetsets found from classpath: [INFO] org.vaadin.teemu.ratingstars.gwt.RatingStarsWidgetset in jar:file:D:/m2repository/org/vaadin/addons/ratingstars/2.1/ratingstars-2.1.jar!/ [INFO] org.vaadin.sparklines.SparklinesWidgetset in jar:file:D:/m2repository/org/vaadin/addons/sparklines/7.0.2/sparklines-7.0.2.jar!/ [INFO] com.vaadin.DefaultWidgetSet in jar:file:D:/m2repository/com/vaadin/vaadin-client/8.10.1/vaadin-client-8.10.1.jar!/ [INFO] org.vaadin.grid.cellrenderers.RenderersCollectionWidgetSet in jar:file:D:/m2repository/com/vaadin/grid-renderers-collection-addon/2.7.0/grid-renderers-collection-addon-2.7.0.jar!/ [INFO] Addon styles found from classpath: [INFO] VAADIN/addons/app-layout/app-layout.scss in jar:file:D:/m2repository/com/github/appreciated/app-layout-addon/1.0.2/app-layout-addon-1.0.2.jar!/
最终编译失败,抛出错误:
[INFO] auto discovered modules [AppWidgetset] [INFO] Compiling module AppWidgetset [INFO] [ERROR] An internal compiler exception occurred [INFO] com.google.gwt.dev.jjs.InternalCompilerException: Error constructing Java AST [INFO] at com.google.gwt.dev.jjs.impl.GwtAstBuilder.translateException(GwtAstBuilder.java:3997) [INFO] at com.google.gwt.dev.jjs.impl.GwtAstBuilder$AstVisitor.endVisit(GwtAstBuilder.java:2169) [INFO] at org.eclipse.jdt.internal.compiler.ast.TryStatement.traverse(TryStatement.java:1244) [INFO] ... [INFO] Caused by: java.lang.NoSuchFieldError: resources [INFO] at com.google.gwt.dev.jjs.impl.GwtAstBuilder$AstVisitor.endVisit(GwtAstBuilder.java:2144) [INFO] ... 26 more [INFO] [ERROR] at DateTimeService.java(87): try [INFO] { [INFO] return LocaleService.getMonthNames(locale)[month]; [INFO] } [INFO] catch (final LocaleNotLoadedException e) [INFO] { [INFO] getLogger().log(Level.SEVERE, "Error in getMonth", e); [INFO] return null; [INFO] }
偶尔也会出现另一个错误:
[INFO] [ERROR] at DecimalMinValidatorForString.java(35): try [INFO] { [INFO] bigValue = new BigDecimal(value); [INFO] } [INFO] catch (NumberFormatException e) [INFO] { [INFO] return false; [INFO] }
根本原因
- Widgetset配置不匹配:项目指定了Vaadin 7的Widgetset,而Vaadin 8.x应使用对应版本的Widgetset,混合版本会引发类路径冲突。
- Addon版本兼容问题:项目中存在Vaadin 7版本的Addon依赖(如sparklines 7.0.2),与Vaadin 8.10.1不兼容,导致编译时类加载冲突。
- GWT内部版本/依赖冲突:编译时出现的
NoSuchFieldError: resources是GWT AST构建环节的字段缺失问题,通常由GWT依赖版本不一致或冲突导致。
可行解决办法
1. 修正Widgetset配置
将@Widgetset注解值替换为Vaadin 8的默认Widgetset,若有自定义Widgetset需确保继承自Vaadin 8版本:
@SpringUI @Theme("valo-ps") @Widgetset("com.vaadin.DefaultWidgetSet") @StyleSheet({"https://fonts.googleapis.com/css?family=Roboto"})
2. 统一Addon为Vaadin 8兼容版本
- 将sparklines、ratingstars等Addon升级到支持Vaadin 8的版本,移除所有Vaadin 7版本的Addon依赖。
- 检查所有第三方依赖,确保其版本与Vaadin 8.10.1兼容。
3. 锁定GWT依赖版本
在pom.xml中明确指定GWT依赖版本为2.8.2,避免间接依赖引入不一致版本:
<dependency> <groupId>com.google.gwt</groupId> <artifactId>gwt-dev</artifactId> <version>2.8.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.google.gwt</groupId> <artifactId>gwt-user</artifactId> <version>2.8.2</version> <scope>provided</scope> </dependency>
4. 清理缓存并重新构建
- 执行
mvn clean install清理本地仓库缓存与项目构建文件。 - 删除项目target目录后,重新执行Widgetset编译命令。
5. 替换CheckboxRenderer实现(可选)
若Grid Renderers Collection Addon问题无法快速解决,可使用Vaadin 8内置组件自定义Renderer:
paymentGrid.addComponentColumn(payment -> { Checkbox checkbox = new Checkbox(); checkbox.setValue(payment.getSelectedToMultiAction()); checkbox.addValueChangeListener(event -> { payment.setSelectedToMultiAction(event.getValue()); if (event.getValue()) { selectedPayments.add(payment); } else { selectedPayments.remove(payment); } }); return checkbox; }).setCaption("");
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

