Question

J'ai besoin de remplacer certaines fonctionnalités par défaut Maven par ma propre implémentation, et je recherche un moyen propre de le faire.

J'ai étendu org.apache.maven.repository.internal.DefaultVersionRangeResolver et enregistré mon composant étendu à l'aide d'un composant.xml comme suit:

<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>

J'ai installé le projet qui contient cela dans mon dépôt local, et je le référence comme celui-ci dans pom.xml d'un autre projet:

<build>
    <extensions>
        <extension>
            <groupId>my.groupId</groupId>
            <artifactId>maven-version-resolver</artifactId>
            <version>SNAPSHOT</version>
        </extension>
    </extensions>
</build>

Cependant, mon artefact n'est pas utilisé. Quand j'exécute ce petit script Gmaven Groovy à l'intérieur de la construction:

session.container.getComponentDescriptorList(
    'org.sonatype.aether.impl.VersionRangeResolver'
).each{
    println "Role Hint: ${it.roleHint}, implementation: ${it.implementation}" ;
}

Il me montre à la fois l'implémentation par défaut et ma propre implémentation, à la fois avec l'indice «par défaut». Alors, comment puis-je résoudre ce problème?

  • Dois-je définir un paramètre supplémentaire dans les composants.xml (peut-être une priorité plus élevée)?
  • Dois-je écrire mon composant en tant que plugin maven et enregistrer activement le composant par programme?
  • Y a-t-il une documentation Plexus qui couvre cela?
Était-ce utile?

La solution

C'est une réponse très tardive, mais j'espère que cela aidera ceux qui sont restés coincés avec un problème similaire à Maven-Core.

Avec Maven 3.3.1, il est possible d'utiliser des extensions de noyau personnalisées qui sont définies dans Root du projet et ne nécessitent aucune modification pour commander des paramètres ou l'installation de Maven: https://maven.apache.org/docs/3.3.1/release-notes.html#core_extensions.

J'ai eu le même problème comme vous pour personnaliser la résolution de la plage de versions et j'ai réussi à le faire fonctionner. Ma première implémentation de travail est étiquetée ici: https://github.com/splatch/maven-osgi-resolver/tree/3.3.9-a. J'ai poussé un peu de code en avant, mais cette balise contient tout ce dont vous avez besoin pour personnaliser la gestion des plages de versions.

En général, le diable est assis en détail - vous devez utiliser des annotations de plexus et déclarer META-INF/maven/extension.xml package d'exportation avec plexus-components.xml, Sinon, cela ne fonctionnera pas.

Autres conseils

Apparemment, le problème est que la définition de ma composante est enregistrée trop tard. Au moment où le pom <extension> est analysé, le régulier DefaultVersionRangeResolver a déjà été instancié.

La solution est plus un hack:

  1. Créer un répertoire à l'intérieur$MAVEN_HOME Et mettez vos composants là-bas
  2. les enregistrer dans $ 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
    

    (Comme vous pouvez le voir ext/.* est chargé avant lib/.*)

Étant donné que mon composant est destiné à ajouter des fonctionnalités à l'échelle du site, je devrai maintenant créer un plugin qui installe et applique ces extensions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top