6

我有 spring boot 项目,我尝试使用spring boot 依赖管理插件来使用提供的依赖版本。

该插件“模拟” mavens 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"

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

4

3 回答 3

1

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

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

实际上 gradle 使用一些规则。这些在下面给出:

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

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

  3. 弹簧文档

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

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

  1. spring-boot-gradle-plugin也可用,它提供了创建可执行 jar 和从源代码运行项目的任务。它还提供依赖项管理,除其他功能外,还允许您省略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. 在没有提供版本的情况下,一些 gradle 依赖项如何工作

于 2017-10-31T16:25:03.370 回答
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工件的版本...

于 2017-10-30T13:23:24.777 回答
0

发生这种情况是因为当.(eg ${a.b}) 用于 groovy 中的字符串插值时,它将作为先行者.视为具有以下属性的对象.。所以在${a.b}对象中a应该有属性b,否则它会失败。在你的例子jackson中是一个实例,String它没有版本属性。要解决它,您可以使用 egjacksonVersion或 a Map在此处查看演示。

于 2017-10-29T09:00:07.983 回答