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>

これを含むプロジェクトをローカル リポジトリにインストールし、別のプロジェクトの 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 でタグ付けされています。コードを少し進めましたが、このタグには、バージョン範囲の処理をカスタマイズするために必要なものがすべて含まれています。

META-INF/maven/extension.xml一般に、悪魔は詳細に座っています。神経叢の注釈を使用し、エクスポート パッケージで宣言する必要がありますplexus-components.xml。そうしないと、機能しません。

于 2017-02-01T01:32:50.077 に答える