【问题标题】:Gradle: Access version declaration in spring boot dependency-management pluginGradle:Spring Boot 依赖管理插件中的访问版本声明
【发布时间】:2017-10-25 13:07:30
【问题描述】:

我有 Spring Boot 项目,我尝试使用 spring boot dependency-management plugin 来使用提供的依赖版本。

插件“模拟” maven 的 BOM 行为,这意味着它以某种方式从 maven 父项目中检索库的版本(我不确定这是如何实现的,但通常版本取自 pom.xml)。它确实具有 jackson.version 属性,用于设置 com.fasterxml.jackson.dataformat 组中工件的版本。

我的项目使用来自同一组的工件,但它未包含在 BOM (jackson-dataformat-yaml) 中,但我想使用相同的 jackson 版本。

我尝试像这样添加编译依赖:

compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${jackson.version}"

但构建失败:

无法为 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象获取未知属性“jackson”。

问:有没有办法访问该属性?或者我还能如何重用 lib 版本?

更新 我不知道为什么我不从一开始就尝试这个,但它确实有效:

compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml"

但是我不知道为什么会这样(工件没有在任何地方声明)。

【问题讨论】:

  • 修改我的答案以回答为什么您的更新解决方案有效;-)

标签: spring-boot gradle build.gradle maven-bom


【解决方案1】:

使用工作示例更新问题后,我将尝试回答 为什么 它可以在不指定版本的情况下工作:

您所指的 pom.xml 包含依赖项

<dependency>
    <groupId>com.fasterxml.jackson</groupId>
    <artifactId>jackson-bom</artifactId>
    <version>${jackson.version}</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>

...它引用了jackson-bom项目中的以下pom.xml,其中又包含以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>${jackson.version.dataformat}</version>
</dependency>

...这反过来又指定了 jackson-dataformat-yaml 工件的版本...

【讨论】:

  • 对不起,我的问题有点误导,我更新了描述。实际上父项目不是标准的 gradle-parent 项目。依赖管理相关功能是通过 spring boot 插件实现的,该插件导入在 maven BOM 中声明的版本。一般project.parent 会返回null。你可以在这里start.spring.io生成一个项目来找到这样的配置
【解决方案2】:

但是我不知道为什么会这样(工件未声明 任何地方)。

所以担心您没有使用任何版本,但它是如何工作的?

其实gradle使用一些规则。如下:

  1. Gradle 将使用传递依赖管理来指定实际版本。

  2. 另一方面,它将使用第一级或第二级存储库层次结构来获取最新版本。

  3. 来自spring documentation

Maven 的依赖管理包括一个概念 物料清单 (bom)。 bom 是一种特殊的 pom,用于 控制项目依赖的版本并提供 定义和更新这些版本的中心位置。

有关更多信息,您可以阅读本教程:Gradle dependencies with jars that have no version number

  1. spring-boot-gradle-plugin 也可用,它提供了创建可执行 jar 和从源代码运行项目的任务。它还提供了dependency management,除其他功能外,允许您省略 Spring Boot 管理的任何依赖项的版本号
plugins {
    id 'org.springframework.boot' version '1.5.8.RELEASE'
    id 'java'
}


repositories {
    jcenter()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

资源链接:

  1. https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-build-systems.html

  2. How are some gradle dependencies working with no version supplied

【讨论】:

    【解决方案3】:

    发生这种情况是因为当.(例如${a.b})在groovy中用于字符串插值时,它会将.前面的对象视为具有.后面属性的对象。所以在${a.b} 对象a 应该有属性b 否则它会失败。在您的示例中,jacksonString 的一个实例,它没有版本属性。要解决它,您可以使用例如jacksonVersionMap。查看演示 here

    【讨论】:

    • 感谢您的回答。不幸的是,这不是一个选择。首先,我无法控制父项目,也无法在那里更改任何内容。第二件事是它不是标准的父项目。事实上,它是 maven 项目,spring-boot gradle 插件可以从那里导入 BOM(它需要来自 github.com/spring-projects/spring-boot/blob/1.5.x/… 的版本)。您可以在start.spring.io 上生成这样的 gradle 项目并检查。
    • @OleksandrShpota,对不起,我觉得我可能会错过一些东西。能否请您准备一个重现问题的演示?
    猜你喜欢
    • 2015-10-13
    • 2016-08-13
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2012-06-30
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多