是否可以使用 Spring 的 Gradle 依赖管理插件设置 dependencySet 条目的分类器

Posted

技术标签:

【中文标题】是否可以使用 Spring 的 Gradle 依赖管理插件设置 dependencySet 条目的分类器【英文标题】:Is it possible to set a dependencySet entry's classifier using Spring's Gradle dependency management plugin 【发布时间】:2021-04-11 10:22:20 【问题描述】:

我有一个项目在多项目 Gradle 构建中使用 Spring Dependency Management Plugin 来为项目指定一致的依赖版本。

根据the documentation,当多个依赖共享同一个组和版本时,应该使用一个依赖集:

当您想为具有相同组和版本的多个模块提供依赖项管理时,您应该使用依赖项集。使用依赖集无需多次指定相同的组和版本,如下例所示:

dependencyManagement 
     dependencies 
          dependencySet(group:'org.slf4j', version: '1.7.7') 
               entry 'slf4j-api'
               entry 'slf4j-simple'
          
     

该项目使用共享组和版本的两个依赖项,但其中一项还指定了一个分类器:

dependencies 
  annotationProcessor 'com.querydsl:querydsl-apt:4.2.2:general'
  implementation 'com.querydsl:querydsl-mongodb:4.2.2'

如果有办法在这种情况下使用dependencySet,我在文档或在线搜索中没有找到它:

dependencyManagement 
    dependencies 
        dependencySet(group:'com.querydsl', version: '4.2.2') 
            entry 'querydsl-apt' // Can I specify that this uses the "general" classifier?
            entry 'querydsl-mongodb'
        
    

简而言之,当其中一个依赖项需要分类器时,有没有办法使用dependencySet,这样做的语法是什么?

【问题讨论】:

【参考方案1】:

Issue #67 用于依赖管理插件请求此功能。问题是维护者closed,插件维护者的状态为“拒绝”:

当分类器在 Gradle 中仍然是二等公民时,这是不可能实现的。我不认为这会很快改变(Gradle 3.0 中的情况并没有改善)所以,有些遗憾,我将关闭它。

该问题的后续对话表明,Gradle 6 中的底层 Gradle 问题仍未解决。

这意味着分类器不仅不能使用dependencySet 指定,也不能使用dependencyManagement 部分中的dependency 条目指定:

dependencyManagement 
    dependencies 
        dependency 'com.querydsl:querydsl-apt:4.2.2:general' // INVALID
        dependency 'com.querydsl:querydsl-mongodb:4.2.2'
    

更糟糕的是,没有发出警告或失败,因此用户并不清楚它没有使用带有分类器的指定版本。

所以回答这个问题,在dependencyManagement 插件中分类器的使用不受支持,因为Gradle 没有为插件提供访问分类器的API。因此,不能在dependencyManagement 部分中直接使用dependency 或使用dependencySet 作为组来指定带有分类器的依赖版本。

【讨论】:

以上是关于是否可以使用 Spring 的 Gradle 依赖管理插件设置 dependencySet 条目的分类器的主要内容,如果未能解决你的问题,请参考以下文章

Gradle,如何禁用所有传递依赖

Gradle + Spring启动项目:包括外部jar依赖项

Gradle:使用 Spring Boot 依赖项构建“fat jar”

多模块 Spring Boot 项目中的 Gradle 依赖插件

如何在 gradle 中获取 spring-boot 依赖版本?

如何从 Gradle 中的所有依赖项中忽略特定的传递依赖项