0

在我的 GAE/J 项目中,我尝试使用 Google API、电子表格和日历。

但是电子表格 API CONTAINER 包含 google-collect-1.0-rc1.jar,其中包含旧版本的 Joiner 类。

Calendar 需要更新版本的它(使用 on() 方法),它随 guava-jdk5-13.0.jar 一起提供,位于 Calendar API CONTAINER 中。

当 Calendar 代码运行时,Joiner 类已被解析(成为旧版本)并因 NoSuchMethod 错误而失败。

这意味着它们不兼容。我尝试了多个类路径设置,但没有成功。电子表格访问有效,但日历访问失败。

其他人看到这个并有解决方法吗?

4

2 回答 2

1

尝试从 google-collect-1.0-rc1.jar 中删除 Joiner 类 - 我已经从一些 jar 文件中删除了类,不是很干净,但工作正常。

于 2013-03-05T02:51:30.013 回答
1

'google-collect-1.0-rc1.jar 已弃用,并已被此处描述的 'guava' jar 取代: https ://code.google.com/p/guava-libraries/wiki/GuavaExplained

问题是,正如 OP 所述,某些 Google API 确实不兼容,需要一些非常小心的处理。例如,Google 电子表格 API 仍然与 google-collect-1.0-rc1.jar 打包在一起

有关更多信息,请参阅: https ://code.google.com/p/gdata-java-client/issues/detail?id=344

这是我为使 Calendars(Oauth) 与电子表格一起使用所做的工作(使用客户端库):

  • 不要使用 Eclipse 插件来管理 Google API - 我发现它在 DEV 中工作,但是一旦我部署到 GAE 它就不起作用,我认为因为部署过程复制了在它使用的目录中找到的 jar:'。 google_apis/' - 这会导致运行时错误,例如:

引起:java.lang.NoSuchMethodError:
com.google.common.collect.ImmutableSet.of([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;

如上所述,手动管理 jar 还可让您在必要时切换 jar。

  • 并非所有版本的“java 客户端”库都是相同的,即使它们可能共享相同的名称,例如“gdata-client-1.0.jar”如果您希望它依赖于 Guava 而不是依赖于 Guava,则需要使用新的旧集合 jar :(即 1.4.7.1 - 在此处下载https://code.google.com/p/gdata-java-client/
  • 小心手动删除并重新复制您的 jar 到 war/WEB-INF/lib 中,因为 eclipse 不会为您完全管理这个(特别是如果您正在更新同名的 jar)
  • 最后,通过解决您从哪些文件中获取依赖项来帮助跟踪运行时错误的提示:

System.out.println("URL:" + Thread.currentThread().getContextClassLoader().getResource("com/google/common/collect/ImmutableSet.class"));

于 2013-03-06T14:40:45.603 回答