【问题标题】:Using Guava 10's Predicate and Function interfaces with GWT 2.4.0在 GWT 2.4.0 中使用 Guava 10 的 Predicate 和 Function 接口
【发布时间】:2011-12-10 15:45:03
【问题描述】:

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

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

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

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

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

我似乎还收到了几个接口不匹配错误:

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

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

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

关于我的设置可能有什么问题有什么想法吗?

我的项目.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

【问题讨论】:

  • 您的 webapp 项目中包含了哪个 JAR? guava-10.0.1.jarguava-gwt-10.0.1.jar?
  • @Strelok:两者都在 war/WEB-INF/lib 和项目的构建路径中(作为非外部 JAR)
  • 函数和谓词用于变换和过滤。检查那些进口。我遇到了方法不匹配的问题,因为 Transform 来自某个不稳定的地方,而不是来自 google.common。

标签: java gwt guava


【解决方案1】:

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

  • 将 GWT 模块描述符添加到 jsr305-2.0.0.jar。在至少应包含子文件夹 javax/annotation 中的 java 源的 jar 中添加一个文件 Annotation.gwt.xml,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<module>
    <source path="" />
</module>
  • 在 Eclipse 中将修改后的 jsr305-2.0.0.jar 添加到 GWT 项目的类路径中。虽然在别处有说明,但不需要将此 jar 添加到 WEB-INF/lib

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

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

就是这样!现在您的 Eclipse 项目将成功编译,并且开发/托管模式也将正常工作。

【讨论】:

    【解决方案2】:

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

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

    我的建议:

    在您的所有 *.java 文件中搜索 "thirdparty" 子字符串并将其替换为正确的导入 - 它对我有用。

    更深入一点的解释是,在 Guava 的早期版本中,jsr305 包含在 guava jar 中,但在这个版本中,他们将其取出,并且对它的依赖确实出现在 lib 的 Maven pom 中,但在网络上没有很好的记录地点。这在用户中引起了很多混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多