我发现需要在我的项目中使用String.format。但是,这在GWT中不起作用,我有一个使用GWT RegExp的替代品。但是,在使用不依赖于GWT的普通Swing接口时,我希望我的项目能够正常运行。共享代码依赖于String.format。问题是我不知道如何使GWT编译器使用与其他代码不同的类。我已经尝试在一个文件中完成所有操作,但它不起作用,因为GWT无法处理我用来检测类路径中缺少GWT的NoClassDefFoundError异常。
这是我目前的代码:
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构建脚本用不同的文件替换整个文件?
答案 0 :(得分:4)
一种解决方案是使用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应用程序有一个不同的模块),你可以在任何需要的地方自动获得正确的实现。