【发布时间】:2018-07-13 09:50:43
【问题描述】:
我有依赖:
A-
B(这也取决于A)。
现在,我想在A 上使用说明符,可以说:A-foo。但是,B 仍然依赖于A,因此,我将A-foo 和A 都包含在目标工件中。
有没有办法强制分类器依赖某些依赖?
为什么?
我需要这个的原因如下。
我的A 是一个基于 Java8 构建的 Java 库,但打包为 Multi-Release Jar,这意味着它包含在 Java9 上运行 jar 时的其他类。
不幸的是,一些旧工具和服务器不知道 MR Jars,这使得它们无法工作。
出于这个原因,我有我的库的A-foo 版本,即没有任何额外的类,所以旧服务器可以运行它。
但是,如果用户正在使用依赖于我的A 的库B,他将只获得A 的MRJar 版本,它会再次失败。我希望能够以某种方式防止这种情况发生。
【问题讨论】:
-
关于“为什么”部分:如果 B 能够在库的 A-foo 版本上运行,为什么不总是将其用作 B 的依赖项?这似乎是一个简单的出路。如果您的应用程序确实更复杂,并且您希望同时加载 A 和 A-foo,则需要通过版本号来处理。如果你有一个 1.0.0 版本和一个 1.0.0-MRJar 版本,那么 Maven 将只加载其中一个,并且很容易替换另一个。
-
因为 1) B 不在我的控制范围内 2) B 应该尽可能使用 A,因为它可以提供更高的性能 3) B 如果在 Java9 上需要 A。
-
我会将 A-foo 定义为 A 的不同版本(如上所述)。然后很容易用dependencyManagement覆盖版本号(因此用A-foo替换A)。分类器不是正确的方法。您甚至可以尝试使用配置文件并根据 Java 版本激活/停用它们。
标签: maven gradle dependencies maven-3