替换 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<extension>
的时候,正则的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 中的丛组件的主要内容,如果未能解决你的问题,请参考以下文章