【问题标题】:Google Ads API Java Client Library: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkNotNullGoogle Ads API Java 客户端库:java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkNotNull
【发布时间】:2018-04-27 09:06:12
【问题描述】:

尝试使用Google Ads API Java Client Library 访问 Adwords API(代码 sn-p 取自项目 README):

val credential = new OfflineCredentials.Builder()
  .forApi(OfflineCredentials.Api.ADWORDS)
  .withClientSecrets(clientId, clientSecret)
  .withRefreshToken(refreshToken)
  .build()
  .generateCredential()

这失败并出现错误:

[info] Exception encountered when attempting to run a suite with class name: AdwordsClientSpec *** ABORTED ***
[info]   java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkNotNull(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
[info]   at com.google.api.ads.common.lib.auth.OfflineCredentials$Api.<init>(OfflineCredentials.java:89)
[info]   at com.google.api.ads.common.lib.auth.OfflineCredentials$Api.<clinit>(OfflineCredentials.java:81)
[info]   at AdwordsClient$.generateAdwordsCredential(AdwordsClient.scala:24)
[info]   at AdwordsClientSpec$$anonfun$1.apply$mcV$sp(AdwordsClientSpec.scala:23)
[info]   at AdwordsClientSpec$$anonfun$1.apply(AdwordsClientSpec.scala:18)
[info]   at AdwordsClientSpec$$anonfun$1.apply(AdwordsClientSpec.scala:18)
[info]   at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info]   at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]   at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]   at org.scalatest.Transformer.apply(Transformer.scala:22)

似乎某些依赖项未正确解析。我将 README 中提到的两个工件的最新版本与 sbt 一起使用:

 "com.google.api-ads" % "ads-lib" % "3.5.0",
 "com.google.api-ads" % "adwords-axis" % "3.5.0"

【问题讨论】:

  • 这看起来像是 Guava 版本冲突 - 您的项目中是否有任何 Guava 依赖项(直接或传递)? (除了在 Google API 库中使用的那个)。如果您不确定 - 请编辑帖子以包含 所有 您的 SBT 依赖项。
  • @TzachZohar 感谢您提供此提示,这是解决此问题的有用出发点。

标签: scala sbt google-ads-api


【解决方案1】:

正如@TzachZoha 指出的那样,存在与 Guava 的版本冲突。 com.google.api-ads 使用 Guava 16.0 而不是 Guava 20.0。我能够通过更改 sbt 构建定义来编译我的代码:

  ("com.google.api-ads" % "ads-lib" % "3.5.0").exclude(
    "com.google.guava", "guava"),
  "com.google.api-ads" % "adwords-axis" % "3.5.0",
  "com.google.guava" % "guava" % "20.0"

【讨论】:

    【解决方案2】:

    我可以通过从我的 lib 文件夹中删除 Google Collections jar 来解决这个问题,该文件夹与其他一些 jar 一起出现;见https://code.google.com/archive/p/google-collections/#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多