2011-02-15 51 views
3

我需要用我自己的实现替换一些Maven默认功能,并且我正在寻找一种干净的方式来实现这一点。替换Maven 3中的plexus组件3

我已经扩展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> 

但是,我的工件没有使用。当我在build中运行这个小GMaven groovy脚本时:它显示了默认实现和我自己的实现,两者均使用提示“default”,这两个脚本都是在默认实现下运行的。那我该如何解决这个问题?

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

嘿,你有没有试过用Maven 3.3扩展机制?也可以扩展核心机制。 – splatch 2017-01-24 16:58:09

回答

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。我向前推了一些代码,但是这个标签包含了你需要的所有东西来定制版本范围处理。

一般魔鬼坐在细节 - 你必须使用丛注释和META-INF/maven/extension.xml出口包plexus-components.xml申报,否则它将无法正常工作。

3

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

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

  1. $MAVEN_HOME创建一个目录,并把你的 成分有
  2. 在 $ MAVEN_HOME`注册它们/斌/ 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/.*之前加载)

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