Google API 客户端链接了错误版本的 jackson-core

Google API Client linking wrong version of jackson-core

我包括最新版本的 Google API 客户端(用于与 AppEngine 端点交互)。

我在组装时遇到这个崩溃:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':backend:endpointsDiscoveryDocs'.
  at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
  at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
  at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
  at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
  at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
  at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
  at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
  at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
  at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
  at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
  at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
  at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.run(DefaultTaskGraphExecuter.java:248)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
  at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
  at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
  at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
  at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access0(DefaultTaskPlanExecutor.java:80)
  at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:105)
  at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.execute(DefaultTaskPlanExecutor.java:99)
  at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
  at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
  at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
  at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
  at org.gradle.internal.concurrent.ManagedExecutorImpl.run(ManagedExecutorImpl.java:46)
  at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z
  at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:537)
  at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:448)
  at com.google.api.server.spi.ObjectMapperUtil.createStandardObjectMapper(ObjectMapperUtil.java:75)
  at com.google.api.server.spi.ObjectMapperUtil.createStandardObjectMapper(ObjectMapperUtil.java:62)
  at com.google.api.server.spi.tools.GenClientLibAction.<clinit>(GenClientLibAction.java:37)
  at com.google.api.server.spi.tools.EndpointsTool.<init>(EndpointsTool.java:55)
  at com.google.cloud.tools.gradle.endpoints.framework.server.task.GenerateDiscoveryDocsTask.generateDiscoveryDocs(GenerateDiscoveryDocsTask.java:122)
  at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
  at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
  at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
  at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
  at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:731)
  at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:705)
  at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.run(ExecuteActionsTaskExecuter.java:122)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
  at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
  at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
  at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
  ... 27 more

我检查了我的依赖项:

+--- com.google.apis:google-api-services-oauth2:v1-rev129-1.22.0
|    \--- com.google.api-client:google-api-client:1.22.0
|         +--- com.google.oauth-client:google-oauth-client:1.22.0
|         |    +--- com.google.http-client:google-http-client:1.22.0
|         |    |    \--- com.google.code.findbugs:jsr305:1.3.9 -> 3.0.1
|         |    \--- com.google.code.findbugs:jsr305:1.3.9 -> 3.0.1
|         +--- com.google.http-client:google-http-client-jackson2:1.22.0
|         |    +--- com.google.http-client:google-http-client:1.22.0 (*)
|         |    \--- com.fasterxml.jackson.core:jackson-core:2.1.3
|         \--- com.google.guava:guava-jdk5:17.0

如您所见,包含的jackson-core版本是2.1.3

然而,函数com.fasterxml.jackson.core.JsonFactory.requiresPropertyOrdering()Z的第一个声明出现在2.3版本中:

http://grepcode.com/file/repo1.maven.org/maven2/com.fasterxml.jackson.core/jackson-core/2.3.0/com/fasterxml/jackson/core/JsonFactory.java/

Google 库是否链接了错误的 jackson-core 版本?

万一它是相关的,这在将我的 v1 Google Cloud Endpoints 代码迁移到 v2 的过程中开始发生。

更新 1

当我从Google API客户端中删除依赖项或强制升级它时,也会出现同样的错误。

升级时的示例依赖树:

+--- com.google.apis:google-api-services-oauth2:v1-rev129-1.22.0
|    \--- com.google.api-client:google-api-client:1.22.0
|         +--- com.google.oauth-client:google-oauth-client:1.22.0
|         |    +--- com.google.http-client:google-http-client:1.22.0
|         |    |    \--- com.google.code.findbugs:jsr305:1.3.9 -> 3.0.1
|         |    \--- com.google.code.findbugs:jsr305:1.3.9 -> 3.0.1
|         +--- com.google.http-client:google-http-client-jackson2:1.22.0
|         |    +--- com.google.http-client:google-http-client:1.22.0 (*)
|         |    \--- com.fasterxml.jackson.core:jackson-core:2.1.3 -> 2.6.0
|         \--- com.google.guava:guava-jdk5:17.0

Gradle 我用来升级依赖的片段:

configurations {
    all {
        resolutionStrategy {
            force 'com.fasterxml.jackson.core:jackson-core:2.6.0'
            force 'com.fasterxml.jackson.databind:jackson-databind:2.6.0'
        }
    }
}

Gradle 我用来删除依赖的片段:

compile "com.google.apis:google-api-services-oauth2:v1-rev129-1.22.0", {
    exclude group: "com.fasterxml.jackson.core", module: "jackson-core"
}

更新 2

看来可能还有其他问题。同步时出现以下错误:

14:13:27.882 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.google.api.server.spi.tools.GenClientLibAction
14:13:27.882 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.google.api.server.spi.tools.EndpointsTool.<init>(EndpointsTool.java:55)
14:13:27.882 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at com.google.cloud.tools.gradle.endpoints.framework.server.task.GenerateDiscoveryDocsTask.generateDiscoveryDocs(GenerateDiscoveryDocsTask.java:122)
14:13:27.882 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)

可能是这次失败的同步导致构建每次都失败。

Endpoints 框架需要比客户端库更新的 Jackson 版本。如果您在同一个库中有客户端库和 Endpoint 框架,则应从客户端库中排除 Jackson 依赖项。

问题已通过 hacky 解决方案解决。

github issue tracker for the Google Cloud Platform 上有问题。

solution itself can be found here.

简而言之,解决方法是将所有构建脚本依赖项移动到根项目 build.gradle 文件中。

And the suggestion on that bug is to add all buildscript dependencies in the root. So just move everything from backend/build.gradle/buildscript -> build.gradle/buildscript, so that dependencies are forced to their latest versions.