我需要用自己的实现替换一些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>
我已经在我的本地仓库中安装了包含它的项目,我在另一个项目的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}" ;
}
它向我展示了默认实现和我自己的实现,两者都有提示'default'。那我怎么解决这个问题呢?
答案 0 :(得分:3)
显然问题是我的组件定义注册太晚了。在解析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/.*
)
由于我的组件旨在添加站点范围的功能,我现在必须创建一个安装和实施这些扩展的插件。
答案 1 :(得分: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。我向前推了一些代码,但是这个标签包含了自定义版本范围处理所需的一切。
一般来说,devil会详细介绍 - 您必须使用plexus注释并在META-INF/maven/extension.xml
导出包中使用plexus-components.xml
声明,否则它将无效。