【问题标题】:How to customise maven dependency version resolution?如何自定义maven依赖版本解析?
【发布时间】:2018-05-22 08:17:19
【问题描述】:

所以我想使用 maven 版本范围,但是当前版本解析的规则不符合我的要求。有什么办法,可能是从现有的 maven 插件扩展而来,以便我可以覆盖要选择的范围中的哪个版本作为依赖版本?

例如,假设一个依赖项具有以下范围:

[1.0.0, 2.0.0)

目前这可能会解析为不需要的版本甚至快照(Maven 中有一个 issue 用于此问题,并且仍在进行中)

我想知道是否有任何方法可以查看上述范围的可用候选版本列表,然后选择我需要的版本。在不直接运行插件的情况下使用 maven 插件是否有可能,因此它可以将依赖项作为正常构建的一部分来解决,例如:

mvn clean verify

我不想使用 Maven 版本插件。我们有近 50 个微服务,我们希望自动获取向后兼容的版本,否则每次开发人员进行小的更改时,他们都必须针对所有应用程序运行 maven 版本插件。

我在 maven 中找到了DefaultVersionRangeResolver,任何提示或想法如何编写我自己的版本范围解析器并将其包含在 maven 中?这些东西的文档不是很清楚。

谢谢

【问题讨论】:

  • 使用版本范围,但使用版本 maven 插件呢?它允许您使用细粒度参数将依赖项更新到较新的版本,以仅允许发布、仅允许小更新等。
  • 首先您指的是哪些问题?此外,您可以查看versions-maven-plugin(@JFMeier 已经建议),它可以在这里提供帮助……除此之外,我建议不要使用版本范围……此外,您为什么喜欢使用它们?您要解决的问题是什么...
  • 我指的是这个问题issues.apache.org/jira/browse/MNG-3092
  • 我不想使用 maven 版本插件。我们有近 50 个微服务,我们希望自动获取向后兼容的版本,我们不能在每次开发更改时都遍历所有 50 个并运行版本插件。

标签: maven maven-3 maven-plugin


【解决方案1】:

我认为编写自己的版本范围解析器是不明智的。你可以做什么:

  1. 如果您真的希望在下一次构建中自动更改每个次要或错误修复,您可以丰富您的构建命令,即使用 mvn versions:update-releases ... clean deploy 而不是 mvn clean deploy
  2. 如果您的项目是紧密耦合的,您可以将它们组合成一个多模块项目。然后您可以一起构建所有内容,每个模块都可以获取其他模块的最新更改。

如果您的项目是紧密耦合的,那么自动更新可能是不必要的,并且可能会使开发人员感到困惑 - 由于自动更改组件神秘地引入了一些错误,他们的构建突然中断。

【讨论】:

  • 谢谢。我们谈论的是一家拥有大量应用程序的公司,并将它们转换为一个多模块项目不仅容易,而且还需要所有管理人员和解决方案架构师参与其中。我不会那样做的。多模块项目有自己的问题。自动更新只会发生在向后兼容的更改中。开发人员必须在更改日志中添加一个条目,以确定他们的更改是否为 BC ......所以我们只获取 BC 更改,因为版本范围类似于 [1.0.0, 2.0.0),这意味着重大更改(版本 2 以后)需要手动更改版本
  • 我自己在一家拥有数千个 Java 工件的公司工作,我知道更改需要时间和资源。我理解你的想法,但恕我直言,它不符合 Maven 哲学。如果您真的想要自动进​​行次要更新,请按照我在 (1) 中的建议更改您的构建命令。然后你有你想要的没有版本范围。在我们公司,开发人员决定是否更新,因为微小的更改通常对每个人都不重要,但需要额外的测试。如果您真的想编写自己的依赖解决方案,请考虑使用 Gradle。
【解决方案2】:

我将回答我找到的解决方案。所以我们决定从 4.0.0 这样的高版本开始,这样我们的 maven 存储库中就没有这些版本的 SNAPSHOT。但是,maven 中版本范围的依赖解析有时会起作用并且不可靠。

对于那些仍然想覆盖 maven 行为的人,我在挖掘 maven 代码后找到了方法。

你可以创建一个类如下:

@Named
@Component( role = VersionRangeResolver.class )
public class SemVerRangeResolver
    implements VersionRangeResolver, Service
{
   //The content can be copied and pasted from org.apache.maven.repository.internal.DefaultVersionRangeResolver
}

创建此类后,您需要创建一个名为“components.xml”的文件并将其放置在\src\main\resources\META-INF\plexus\components.xml

<?xml version="1.0" encoding="UTF-8"?>
<component-set>
  <components>
    <component>
      <role>org.eclipse.aether.impl.VersionRangeResolver</role>
      <role-hint>default</role-hint>
      <implementation>com.yourcomp.dependency.SemVerRangeResolver</implementation>
      <description />
      <isolated-realm>false</isolated-realm>
      <requirements>
        <requirement>
          <role>org.eclipse.aether.spi.log.LoggerFactory</role>
          <role-hint />
          <field-name>logger</field-name>
        </requirement>
        <requirement>
          <role>org.eclipse.aether.impl.MetadataResolver</role>
          <role-hint />
          <field-name>metadataResolver</field-name>
        </requirement>
        <requirement>
          <role>org.eclipse.aether.impl.SyncContextFactory</role>
          <role-hint />
          <field-name>syncContextFactory</field-name>
        </requirement>
        <requirement>
          <role>org.eclipse.aether.impl.RepositoryEventDispatcher</role>
          <role-hint />
          <field-name>repositoryEventDispatcher</field-name>
        </requirement>
      </requirements>
    </component>
  </components>
</component-set>

然后创建一个 jar 文件并将其放入您的 {MAVEN_HOME}/lib/ext

这将覆盖默认的 maven 范围依赖解析器,您可以对规则进行任何更改以应用 semver 规则

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2021-10-13
    • 2020-11-28
    • 1970-01-01
    • 2020-10-13
    • 2020-04-26
    • 2020-07-26
    相关资源
    最近更新 更多