替换 Maven 3 中的丛组件

Posted

技术标签:

【中文标题】替换 Maven 3 中的丛组件【英文标题】:Replace plexus component in Maven 3 【发布时间】:2011-06-27 14:49:24 【问题描述】:

我需要用我自己的实现替换一些 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 文档涵盖此内容?

【问题讨论】:

嘿,您尝试过使用 Maven 3.3 扩展机制吗?也可以扩展核心机制。 @splatch 为什么不将其添加为答案? 它仍然无法按预期工作mail-archives.apache.org/mod_mbox/maven-users/201701.mbox/… 【参考方案1】:

显然问题是我的组件定义注册得太晚了。在解析pom&lt;extension&gt;的时候,正则的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/.* 之前加载)

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

【讨论】:

【参考方案2】:

这是一个很晚的答案,但我希望它能帮助那些在 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,否则将不起作用。

【讨论】:

以上是关于替换 Maven 3 中的丛组件的主要内容,如果未能解决你的问题,请参考以下文章

替换 Maven 中的版本

maven项目动态替换配置中的值

如何用 Maven 属性替换 web.xml 中的值?

替换 JavaScript 文件中的 Maven Archetype 属性

使用maven替换项目依赖中的字节码

有没有办法用它的内容替换我在 dom 中的组件?