使用Guava 10的Predicate和Function接口与GWT 2.4.0

时间:2011-10-19 06:01:15

标签: java gwt guava

GWT 2.4.0和Guava GWT 10.0.1是否支持PredicateFunction?两个接口都标记为@GwtCompatible

在调试托管模式下运行项目时,我在使用Predicate时收到运行时验证错误:

  

[错误] [MyProject] - 第XXY行:导入javax.annotation.Nullable   无法解决

     

[错误] [MyProject] - 行YYY:Nullable无法解析为类型

从其他StackOverflow帖子中,我认为这些错误不应该要求包括JSR 305在路径中的Guava版本09(包括路径中的JSR 305无论如何都没有解决问题)。

我似乎也收到了一些接口不匹配错误:

  

[错误] [MyProject] - 第XXX行:新类型   Function(){}必须实现继承的抽象   方法Function.apply(Object)

     

[错误] [MyProject] - 行YYY:类型为new的方法apply(MyType)   Function(){}必须覆盖或实现超类型   方法

,以及使用Predicate时出现的类似错误,我将其作为错误提交:http://code.google.com/p/guava-libraries/issues/detail?id=765

关于我的设置可能出错的任何想法?

我的 Project .gwt.xml文件包含以下行:

<inherits name="com.google.common.collect.Collect" />
<inherits name="com.google.common.base.Base" />

我的java文件包含以下导入:

import com.google.common.base.Function;
import com.google.common.base.Predicate;

我正在使用Eclipse 3.7.1和JavaSE-1.6

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题并找到了解决方法。问题是JSR 305源代码不是GWT模块的一部分,因此被GWT忽略。要解决此问题,请执行以下操作:

  • 将GWT模块描述符添加到jsr305-2.0.0.jar。在jar中应该至少包含子文件夹javax/annotation中的java源代码,添加一个文件Annotation.gwt.xml,其中包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<module>
    <source path="" />
</module>
  • 将修改后的jsr305-2.0.0.jar添加到eclipse中GWT项目的类路径中。虽然在其他地方说明了将添加到WEB-INF/lib

  • 通过在模块的.gwt.xml文件中添加以下行,让您的项目模块继承新创建的GWT模块:

<inherits name='javax.annotation.Annotation'/>

就是这样!现在您的eclipse项目将成功编译,开发/托管模式也将起作用。

答案 1 :(得分:0)

这是一种known bug你需要在你的WEB-INF / lib中拥有jsr305.jar 就是这样。

需要注意的另一件事是,guava的一部分被捆绑在GWT * .jar中,但是它们被放在单独的包中com.google.gwt.thirdparty.guava.common ..... 而且,eclipse经常发生的情况是,在解析导入时它会抓取错误的导入,这会导致运行时出现混乱,因为com.google.gwt.thirdparty.guava中打包的类来自另一个版本,并且不得引用。

我的建议:

“thirdparty”子字符串的所有* .java文件上进行文本搜索,并用正确的导入替换它 - 它对我有效。

更深入的解释是,在以前版本的Guava中,jsr305被包含在番石榴罐中但是这个版本它们将它取出并依赖于它确实出现在lib的Maven pom中,但是在Web上没有很好地记录现场。这引起了用户之间的很多困惑。