我需要用我自己的实现替换一些 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}" ;
}
它向我展示了默认实现和我自己的实现,都带有“默认”提示。那么我该如何解决这个问题呢?
请您参考如下方法:
显然问题是我的组件定义注册得太晚了。当时的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/.*
之前加载)由于我的组件旨在添加站点范围的功能,因此我现在必须创建一个插件来安装和强制执行这些扩展。