【问题标题】:Gradle / Maven difference in treating version rangeGradle / Maven 在处理版本范围方面的差异
【发布时间】:2021-12-31 00:01:21
【问题描述】:

我正在使用QR-Bill library v2.5.3。作为其依赖项之一,它使用[2.0.0,3.0) 范围指定 PDFBox:

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>[2.0.0,3.0)</version>
  <scope>runtime</scope>
</dependency>

对于 Gradle 项目,依赖项解析为 pdfbox-2.0.24。对于 Maven 项目,它解析为 pdfbox-3.0.0-RC1

Maven 和 Gradle 真的对待版本范围不同吗?库的正确范围是多少,以便 Gradle 和 Maven 都使用最新的 2.x 版 PDFBox 但不使用 3.x 版(因为它不兼容)?

更多调试细节:

Maven 项目

https://github.com/manuelbl/SwissQRBill/tree/master/examples/maven_example

% mvn dependency:tree

[INFO] net.codecrete.qrbill:maven-example:jar:1.0-SNAPSHOT
[INFO] \- net.codecrete.qrbill:qrbill-generator:jar:2.5.3:compile
[INFO]    +- io.nayuki:qrcodegen:jar:1.7.0:runtime (version selected from constraint [1.6.0,2.0))
[INFO]    \- org.apache.pdfbox:pdfbox:jar:3.0.0-RC1:runtime (version selected from constraint [2.0.0,3.0))
[INFO]       +- org.apache.pdfbox:fontbox:jar:3.0.0-RC1:runtime
[INFO]       \- commons-logging:commons-logging:jar:1.2:runtime

Gradle 项目

https://github.com/manuelbl/SwissQRBill/tree/master/examples/gradle_example

% gradle dependencies --configuration runtimeClasspath

runtimeClasspath - Runtime classpath of source set 'main'.
\--- net.codecrete.qrbill:qrbill-generator:2.5.3+ -> 2.5.3
     +--- io.nayuki:qrcodegen:[1.6.0,2.0) -> 1.7.0
     \--- org.apache.pdfbox:pdfbox:[2.0.0,3.0) -> 2.0.24
          +--- org.apache.pdfbox:fontbox:2.0.24
          |    \--- commons-logging:commons-logging:1.2
          \--- commons-logging:commons-logging:1.2

【问题讨论】:

  • 这很奇怪。绝对看起来像一个 Maven 错误。报告它,他们可能会在 2030 年之前承认它。

标签: java maven gradle


【解决方案1】:

Maven's ordering implementation 状态比 alpha、beta 和 RC 版本小于实际版本。这就是您看到这种行为发生的原因。

所以,在实践中 pdfbox-3.0.0-RC1

为了完全排除 3.0,您需要排除第一个预发布版本。实现这一目标的一些方法:

[2.0.,3-alpha)

[2.0.0,3.0.0-alpha2)

或者另一个不理想的选择是将范围的上限指定为 2.x 版本的最新版本:

[2.0.0,2.0.24]

最后一个选项远非很好,因为如果 Apache 发布了名为 2.0.25 的 2.x 修订版,Maven 将不会包含它。

【讨论】:

  • 感谢您的回答。这是很好的文档,但仍然令人惊讶的是,没有办法轻松地指定 2.* 的意图。更令人惊讶的是,Gradle 似乎拥有相同的version ordering definition 却对它的处理方式不同。
  • @Codo,是的,人们希望完全排除主要版本会更容易。虽然从严格的顺序 POV 来看确实有意义,但从概念上讲,如果您想排除 3.x,为什么要接受它的 alpha 版本?猜猜 Apache 的目标是灵活性(?谁知道呢……无论如何,很高兴它有帮助!
【解决方案2】:

根据 Diego M. 的回答,以下是一些附加信息:

版本要求[2.0,3.0) 似乎没有任何意义:

  • 典型的意图是将其限制为所有 2.* 版本。但是,Maven 还包括所有 3.0 预发布版本。我无法想象这会有用的情况。
  • Maven 和 Gradle 对它的解释不同。因此,这两种工具都不适用,尤其是在发布到 Maven Central 时。

限制为 2.* 版本的更好版本要求是:[2.0,2.999999]

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多