You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]   }

根本原因

  1. Widgetset配置不匹配:项目指定了Vaadin 7的Widgetset,而Vaadin 8.x应使用对应版本的Widgetset,混合版本会引发类路径冲突。
  2. Addon版本兼容问题:项目中存在Vaadin 7版本的Addon依赖(如sparklines 7.0.2),与Vaadin 8.10.1不兼容,导致编译时类加载冲突。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:58:00