Maven 如何在可传递依赖项上强制使用分类器?

Maven 如何在可传递依赖项上强制使用分类器?,maven,gradle,dependencies,maven-3,Maven,Gradle,Dependencies,Maven 3,我有依赖关系: A B(这也取决于A) 现在,我想在A上使用说明符,比如:A-foo。然而,B仍然依赖于A,因此,我将A-foo和A都包含在目标工件中 有没有办法强制分类器依赖于某些依赖项 为什么? 我需要它的原因如下 MyA是一个基于Java8构建的Java库,但打包为,这意味着当jar在Java9上运行时,它包含额外的类 不幸的是,一些旧的工具和服务器不知道MR Jars,这使得它们无法工作 由于这个原因,我的库有A-foo版本,没有任何额外的类,所以旧服务器可以运行它 但是,如果用户正

我有依赖关系:

  • A
  • B
    (这也取决于
    A
现在,我想在
A
上使用说明符,比如:
A-foo
。然而,
B
仍然依赖于
A
,因此,我将
A-foo
A
都包含在目标工件中

有没有办法强制分类器依赖于某些依赖项

为什么? 我需要它的原因如下

My
A
是一个基于Java8构建的Java库,但打包为,这意味着当jar在Java9上运行时,它包含额外的类

不幸的是,一些旧的工具和服务器不知道MR Jars,这使得它们无法工作

由于这个原因,我的库有
A-foo
版本,没有任何额外的类,所以旧服务器可以运行它


但是,如果用户正在使用依赖于我的
A
的库
B
,他只需获得
A
的MRJar版本,它就会再次失败。我希望能够以某种方式防止这种情况。

带有分类器的工件是不同的工件,而不仅仅是同一工件的不同版本。它不能取代——无论在技术上还是逻辑上——原始工件,这意味着:即使你能在技术上找到绕过它的方法,它也违背了Maven逻辑


如果您更详细地描述要解决的问题,您可能会找到一种“Maven方法”来解决它。

在Gradle中,这可以通过以下代码实现:

compile ('org.jodd:jodd-core:4.1.4:jre9') {
    force = true
}
compile ('org.jodd:jodd-joy:4.1.4') {
    exclude group: 'org.jodd', module:'jodd-core'
}
这意味着:

  • 强制使用图书馆
  • 排除库的可传递非分类器依赖项

谢谢!我真的不知道如何解释它比这更简单:(这正是我的问题所在。也许你可以解释为什么要做这个替换。好的,就这么做了。gradle真的没有办法指定可传递依赖项吗?关于“为什么”-部分:如果B能够在库的A-foo版本上运行,为什么不始终将其用作B的依赖项?这似乎是一个简单的解决方法。如果您的应用程序确实更复杂,并且您想要避免同时加载A和A-foo,则需要通过版本号来处理此问题。如果您有版本1.0.0和版本1.0.0-MRJar,那么Maven将只加载其中一个,并且很容易将其中一个替换为另一个。因为1)B不在我的控制范围内2)B应该尽可能使用A,因为它提供了更高的性能3)B在Java9上需要A if。我将A-foo定义为A的不同版本(如上所述)。然后很容易用dependencyManagement覆盖版本号(因此用A-foo替换A)。分类器不是正确的方法。您甚至可以尝试使用概要文件,并根据Java版本激活/停用它们。