在 Maven 可选依赖项中指定版本

Specifying version in Maven optional dependency

我有一个库项目,我正在考虑在其中添加一些可选的依赖项,因为它们仅在项目编译和 运行 JDK9+ 上需要。

然而,关于可选依赖项的 documentation 并没有阐明是否可以选择性地依赖特定版本,即,如果我可以在我的库 pom 文件中放入类似

<dependency>
    <groupId>com.foo</groupId>
    <artifactId>dependency-a</artifactId>
    <version>2.0</version>
    <optional>true</optional>
</dependency>

并以某种方式确保依赖于我的库并且还想包含 dependency-a 的项目将依赖于版本 2.0。

据我了解,将 dependency-a 设置为可选意味着依赖我的库的项目不会传递依赖它,但如果他们需要一些额外的(可选)功能在我的库中。

有没有办法确保如果他们想添加 dependency-a 他们依赖于特定版本?

如果依赖于我的图书馆的项目有

会怎样
<dependency>
    <groupId>com.foo</groupId>
    <artifactId>dependency-a</artifactId>
    <version>1.0</version>
</dependency>

1.0 版与 2.0 版不兼容?

如果无法在可选依赖项上强制执行版本,那么为可选依赖项设置版本有什么意义?

我也一直在看maven enforcer plugin,因为它似乎能够处理这样的情况,但我想知道是否有更好的解决方案。

我对optional的理解如下:

如果您将某个依赖项声明为可选,它会保留在您的编译类路径中(因此您需要一个版本),但对于您的库的用户而言不可传递可见。因此,您的库的用户需要自己将依赖项(使用合理的版本)添加到他们的 POM 中。

我也看不出您想如何使用 enforcer 插件,因为您图书馆的用户不会 "see" 您的 POM 中的插件。

为了便于使用,我建议为不同的 Java 版本准备两个不同的 jar,按分类器或版本(如 1.2.3-JDK8、1.2.3-JDK9)分隔。

我认为添加对可选库的排除会更有用。例子: 项目 A 有一个可选的依赖项 O 项目 B 在其 pom 文件中包含项目 A。如果 B 想使用 O,则没有任何改变。否则在B的pom文件中A的依赖里面添加一个包含标签排除O:

    <dependency>
        <groupId>project.a.group</groupId>
        <artifactId>project.a.artifact</artifactId>
        <version>1.4</version>
        <exclusions>
            <exclusion>
                <groupId>o.group</groupId>
                <artifactId>o.artifact</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

我仍然不明白使用可选标签的好处,以防我们必须指定版本而不是从第一个项目中删除可选依赖项,并在需要时将其简单地添加到第二个项目中。