替换Maven 3中的丛组件

时间:2011-02-15 13:31:42

标签: maven maven-3 plexus

我需要用自己的实现替换一些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>

我已经在我的本地仓库中安装了包含它的项目,我在另一个项目的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}" ;
}

它向我展示了默认实现和我自己的实现,两者都有提示'default'。那我怎么解决这个问题呢?

  • 我是否需要在components.xml中设置一个额外的参数(可能是更高的优先级)?
  • 我是否需要将我的组件编写为Maven插件并以编程方式主动注册该组件?
  • 是否有任何涵盖此内容的Plexus文档?

2 个答案:

答案 0 :(得分:3)

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

解决方案更像是黑客攻击:

  1. 在里面创建一个目录 $MAVEN_HOME然后把你的 那里的组件
  2. 注册他们 $ 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/.*

  3. 由于我的组件旨在添加站点范围的功能,我现在必须创建一个安装和实施这些扩展的插件。

答案 1 :(得分:3)

这是一个非常晚的答案,但我希望它能帮助那些在maven-core中遇到类似问题的人。

使用Maven 3.3.1,可以使用在项目根目录中定义的自定义核心扩展,并且不需要对命令参数或maven安装进行任何修改:https://maven.apache.org/docs/3.3.1/release-notes.html#Core_Extensions

我遇到了与您一样的问题,即自定义版本范围解析并设法使其正常工作。我的第一个工作实现标记在此处:https://github.com/splatch/maven-osgi-resolver/tree/3.3.9-a。我向前推了一些代码,但是这个标签包含了自定义版本范围处理所需的一切。

一般来说,devil会详细介绍 - 您必须使用plexus注释并在META-INF/maven/extension.xml导出包中使用plexus-components.xml声明,否则它将无效。