【问题标题】:Substituting class when compiling with GWT使用 GWT 编译时替换类
【发布时间】:2011-10-24 18:13:35
【问题描述】:

我发现需要在我的项目中使用 String.format。但是,这在 GWT 中不起作用,我有一个使用 GWT RegExp 的替代品。但是,我希望我的项目在使用不依赖于 GWT 的普通 Swing 接口时能够正常运行。不过,共享代码取决于 String.format。问题是我不知道如何让 GWT 编译器使用与其他代码不同的类。我已经尝试在一个文件中完成所有操作,但它不起作用,因为 GWT 无法处理 NoClassDefFoundError 异常,我使用该异常来检测 GWT 何时从类路径中丢失。

这是我当前的代码:

package testpackage.shared;

import com.google.gwt.regexp.shared.RegExp;
import com.google.gwt.regexp.shared.SplitResult;

public class Util {

  public static String format(final String format, final Object... args) {
    try {
      final RegExp regex = RegExp.compile("%[a-z]");
      final SplitResult split = regex.split(format);
      final StringBuffer msg = new StringBuffer();
      for (int pos = 0; pos < split.length() - 1; pos += 1) {
        msg.append(split.get(pos));
        msg.append(args[pos].toString());
      }
      msg.append(split.get(split.length() - 1));
      return msg.toString();
    } catch (NoClassDefFoundError ex)  {
      return String.format(format, args);
    }
  }
}

如何在没有 GWT 的类路径中编译和运行 GWT 和 JRE?在为 GWT 和 Swing/Sun JRE 构建时,我真的需要让 Ant 构建脚本替换整个文件吗?

【问题讨论】:

标签: java gwt ant noclassdeffounderror


【解决方案1】:

一种解决方案是使用Deferred Binding Replacement:

<replace-with class="testpackage.shared.UtilGWT">
  <when-type-is class="testpackage.shared.Util"/>
</replace-with>

然后在您的 GWT 代码中调用 GWT.create(Util.class)。为了避免 Swing 项目拾取 UtilGWT 类,我会将其放入不同的源文件夹(或者可能指示 Ant 的 javac 任务忽略该文件)。

但是,这仍然不允许您在 Swing 应用程序中重用调用 GWT.create() 的代码部分。所以你必须创建一个工厂,或者在应用程序启动时调用一些初始化,或者类似的东西......如果你没有Dependency Injection,所有常见的问题。

如果你想使用依赖注入(例如Guice/Gin),整个替换一个实现的过程就变得非常自然:创建一个抽象的Util类/接口,以及两个实现:UtilGWT和UtilJRE——然后在您的模块中设置正确的实例(您的 GWT 和 Swing 应用程序将使用不同的模块),并且您会在任何需要的地方自动获得正确的实现。

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2012-11-23
    • 2012-10-31
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多