如何自定义maven依赖项版本解析?

时间:2018-05-22 08:17:20

标签: maven maven-3 maven-plugin

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

例如,让我们说依赖项具有以下范围:

[1.0.0, 2.0.0)

目前,这可能会解决到不需要的版本甚至是快照(Maven中有issue这个并且仍然在进行中)

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

mvn clean verify

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

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

由于

2 个答案:

答案 0 :(得分:0)

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

  1. 如果您真的希望在下一个版本中自动更改每个次要或错误修正,您可以丰富您的构建命令,即代替mvn clean deploy您说mvn versions:update-releases ... clean deploy
  2. 如果您的项目紧密耦合,您可以将它们组合到一个多模块项目中。然后,您可以将所有内容组合在一起,每个模块都可以获得每个模块的最新更改。
  3. 如果你的项目紧密耦合,那么自动更新可能是不必要的,并且可能会使开发人员感到困惑 - 由于自动更改组件神秘地引入了一些错误,他们的构建突然中断。

答案 1 :(得分:0)

我将回答我找到的解决方案。所以我们决定从像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规则