我需要用我自己的实现替换一些 Maven 默认功能,我正在寻找一种干净的方法来做到这一点。

我已延长 org.apache.maven.repository.internal.DefaultVersionRangeResolver并使用 component.xml 注册我的扩展组件,如下所示:

<component-set> 
    <components> 
        <component> 
            <role>org.sonatype.aether.impl.VersionRangeResolver</role> 
            <role-hint>default</role-hint> 
            <implementation>com.my.custom.VersionRangeResolver 
            </implementation> 
            <isolated-realm>false</isolated-realm> 
            <requirements> 
                <requirement> 
                    <role>org.sonatype.aether.spi.log.Logger</role> 
                    <role-hint /> 
                    <field-name>logger</field-name> 
                </requirement> 
                <requirement> 
                    <role>org.sonatype.aether.spi.log.Logger</role> 
                    <role-hint /> 
                    <field-name>logger2</field-name> 
                </requirement> 
                <requirement> 
                    <role>org.sonatype.aether.impl.MetadataResolver</role> 
                    <role-hint /> 
                    <field-name>metadataResolver</field-name> 
                </requirement> 
            </requirements> 
        </component> 
    </components> 
</component-set> 

我已经在我的本地 repo 中安装了包含它的项目,我在另一个项目的 pom.xml 中像这样引用它:
<build> 
    <extensions> 
        <extension> 
            <groupId>my.groupId</groupId> 
            <artifactId>maven-version-resolver</artifactId> 
            <version>SNAPSHOT</version> 
        </extension> 
    </extensions> 
</build> 

但是,我的神器没有使用。当我在构建中运行这个小的 GMaven groovy 脚本时:
session.container.getComponentDescriptorList( 
    'org.sonatype.aether.impl.VersionRangeResolver' 
).each{ 
    println "Role Hint: ${it.roleHint}, implementation: ${it.implementation}" ; 
} 

它向我展示了默认实现和我自己的实现,都带有“默认”提示。那么我该如何解决这个问题呢?
  • 我是否需要在 components.xml 中设置一个额外的参数(也许优先级更高)?
  • 我是否需要将我的组件编写为 Maven 插件并以编程方式主动注册该组件?
  • 是否有任何涵盖此内容的 Plexus 文档?
  • 请您参考如下方法:

    显然问题是我的组件定义注册得太晚了。当时的pom <extension>已解析,常规 DefaultVersionRangeResolver已经被实例化了。

    解决方案更像是一个黑客:

  • 在里面创建一个目录$MAVEN_HOME并把你的
    那里的组件
  • 注册他们
    $MAVEN_HOME`/bin/m2.conf
    main is org.apache.maven.cli.MavenCli from plexus.core 
     
    set maven.home default ${user.home}/m2 
     
    [plexus.core] 
    load ${maven.home}/ext/*.jar 
    load ${maven.home}/lib/*.jar 
    

    (如您所见 ext/.*lib/.* 之前加载)

  • 由于我的组件旨在添加站点范围的功能,因此我现在必须创建一个插件来安装和强制执行这些扩展。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!