替换 Maven 3 中的 plexus 组件

Sea*_*oyd 5 plexus maven-3 maven

我需要用我自己的实现替换一些 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>
Run Code Online (Sandbox Code Playgroud)

我已经在我的本地 repo 中安装了包含它的项目,我在另一个项目的 pom.xml 中像这样引用它:

<build>
    <extensions>
        <extension>
            <groupId>my.groupId</groupId>
            <artifactId>maven-version-resolver</artifactId>
            <version>SNAPSHOT</version>
        </extension>
    </extensions>
</build>
Run Code Online (Sandbox Code Playgroud)

但是,我的神器没有使用。当我在构建中运行这个小的 GMaven groovy 脚本时:

session.container.getComponentDescriptorList(
    'org.sonatype.aether.impl.VersionRangeResolver'
).each{
    println "Role Hint: ${it.roleHint}, implementation: ${it.implementation}" ;
}
Run Code Online (Sandbox Code Playgroud)

它向我展示了默认实现和我自己的实现,都带有“默认”提示。那么我该如何解决这个问题呢?

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

spl*_*tch 4

这是一个很晚的答案,但我希望它能帮助那些在 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。我将代码向前推了一点,但此标签包含自定义版本范围处理所需的所有内容。

一般来说,魔鬼在于细节 - 您必须使用 plexus 注释并在META-INF/maven/extension.xml导出包中使用 进行声明plexus-components.xml,否则它将无法工作。