5

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

2 回答 2

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/.*

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

于 2011-02-15T17:22:23.817 回答
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 。我将代码向前推进了一点,但是这个标签包含了自定义版本范围处理所需的一切。

一般来说,魔鬼在细节上 - 你必须使用 plexus 注释并在META-INF/maven/extension.xml导出包中声明plexus-components.xml,否则它将不起作用。

于 2017-02-01T01:32:50.077 回答