Java 依赖解析过程中的梯度变化分类器

Java 依赖解析过程中的梯度变化分类器,java,gradle,dependency-management,Java,Gradle,Dependency Management,我依赖于由分类器(例如clover)标识的特殊版本的jar。我可以很容易地将其指定为依赖项。不幸的是,pom中指定的所有依赖项都没有分类器 compile(group: 'ch.mypackage', name: 'projectWithTransitiveDeps', version: "1.0.0-SNAPSHOT", classifier: 'clover') 我想将可传递依赖项更改为使用分类器,但对象上有setter: configurations { compile.reso

我依赖于由分类器(例如clover)标识的特殊版本的jar。我可以很容易地将其指定为依赖项。不幸的是,pom中指定的所有依赖项都没有分类器

compile(group: 'ch.mypackage', name: 'projectWithTransitiveDeps', version: "1.0.0-SNAPSHOT", classifier: 'clover')
我想将可传递依赖项更改为使用分类器,但对象上有setter:

configurations {
    compile.resolutionStrategy {
        eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'ch.mypackage') {
                details.useTarget group: details.requested.group, name: details.requested.name, version: details.requested.version, classifier: 'clover'
            }
        }
    }
}
由于分类器是未知属性,上述代码将失败并出现异常


有没有其他方法可以实现这一点?

显然
userTarget
也需要一个字符串,您可以试试:

details.useTarget "$details.requested.group:$details.requested.name:$details.requested.version:clover"

显然,
userTarget
也需要一个字符串,您可以尝试:

details.useTarget "$details.requested.group:$details.requested.name:$details.requested.version:clover"

根据中的评论:

Gradle没有兴趣将分类器概念泄露给约束,因为约束有效地应用于模块,而分类器更像是一个工件概念

这是不可能的

但你仍然可以添加你自己的,比如:

ext.myPackageVersion = '1.0.0-SNAPSHOT'
ext.myPackageClassifier = 'clover'

dependencies {
  compile(group: 'ch.mypackage', name: 'projectWithTransitiveDeps', version: myPackageVersion, classifier: myPackageClassifier) {
    exclude group: "ch.mypackage", module:'transitiveDep'
  }
  compile(group: 'ch.mypackage', name: 'transitiveDep', version: myPackageVersion, classifier: myPackageClassifier)
}

另见。根据中的评论,存在相同的根本问题

Gradle没有兴趣将分类器概念泄露给约束,因为约束有效地应用于模块,而分类器更像是一个工件概念

这是不可能的

但你仍然可以添加你自己的,比如:

ext.myPackageVersion = '1.0.0-SNAPSHOT'
ext.myPackageClassifier = 'clover'

dependencies {
  compile(group: 'ch.mypackage', name: 'projectWithTransitiveDeps', version: myPackageVersion, classifier: myPackageClassifier) {
    exclude group: "ch.mypackage", module:'transitiveDep'
  }
  compile(group: 'ch.mypackage', name: 'transitiveDep', version: myPackageVersion, classifier: myPackageClassifier)
}

另见。对于
userTarget,也存在相同的基本问题

表示此方法可用于在解决依赖关系之前更改依赖关系,例如更改组、名称或版本(或全部三者)。这似乎意味着不支持覆盖分类器。此外,这表明
dependencysolvedetails
已被弃用,您应该改用
dependencysetration
。不确定这会影响什么gradle版本。对于
userTarget
来说,此方法可用于在解决依赖关系之前更改依赖关系,例如更改组、名称或版本(或全部三者)。这似乎意味着不支持覆盖分类器。此外,这表明
dependencysolvedetails
已被弃用,您应该改用
dependencysetration
。不确定这会影响什么gradle版本。谢谢你的建议。不幸的是,它不起作用。没有例外,但它根本不尊重分类器。谢谢你的建议。不幸的是,它不起作用。没有例外,但它根本不尊重分类器。