gradle 插件使用代码中使用的 java 库的 older/different 版本

gradle plugin uses a older/different version of a java library used in the code

我想使用 swagger-gradle-plugin from the swagger-core 项目将我的 JAX-RS api 解析为 OpenApiDefinition。

现在我的问题是插件使用了版本 2.9.10 中的库 com.fasterxml.jackson.core:jackson-databind。我的项目也使用这个库,但是版本 2.10.0。现在,当我 运行 插件的解析任务时,我得到 VerifyError 因为 class 已更改。我已经在 github 上打开了 issue,但问题似乎出在我的配置上。

这是我的 gradle 构建文件:

plugins {
  id "io.swagger.core.v3.swagger-gradle-plugin" version "2.0.10"
}

dependencies {
  ...
  implementation 'io.swagger.core.v3:swagger-annotations:2.0.10'
  implementation "com.fasterxml.jackson.core:jackson-databind:2.10.0"
  implementation "com.fasterxml.jackson.core:jackson-annotations:2.10.0"
  ...
}

resolve {
  outputFileName = 'lcapi'
  outputFormat = 'YAML'
  prettyPrint = 'TRUE'
  classpath = sourceSets.test.runtimeClasspath
  resourcePackages = ['com.example.lc.api']
  resourceClasses = ['com.example.lc.api.LcRestController', 'com.example.lc.api.LcStateController']
  outputPath = file("${project.projectDir}/src/main/resources")
}

有几种方法可以解决这个问题,但我认为最简单的方法是创建一个新配置,该配置从您正在使用的配置扩展而来,但具有强制使用特定版本的 Jackson 的解析策略。它可能看起来像这样:

plugins {
  id "io.swagger.core.v3.swagger-gradle-plugin" version "2.0.10"
}

configurations {
    swagger {
        extendsFrom runtimeClasspath
        resolutionStrategy {
            force 'com.fasterxml.jackson.core:jackson-databind:2.9.10'
            force 'com.fasterxml.jackson.core:jackson-annotations:2.9.10'
        }
    }
}

dependencies {
    implementation 'io.swagger.core.v3:swagger-annotations:2.0.10'
    implementation "com.fasterxml.jackson.core:jackson-databind:2.10.0"
    implementation "com.fasterxml.jackson.core:jackson-annotations:2.10.0"
    // ...
}

resolve {
    classpath = sourceSets.main.output + configurations.swagger
    // ...
}

请注意,我使用普通的 runtimeClasspath 而不是您使用的 testRuntimeClasspath,因为我预计另一个只是尝试使其工作(您可能不会不希望测试资源渗入主要资源)。