2 votes

Trouver toutes les dépendances directes d'un artefact sur Maven Central

Pour un artefact sur Maven central (ou tout autre dépôt Nexus donné), je veux faire une liste de toutes les dépendances directes.

Initialement, j'ai pensé simplement à lire le fichier pom.xml et rassembler toutes les entrées de la section des dépendances. Mais j'ai remarqué que ces entrées pourraient ne pas avoir de version (fournie par la gestion des dépendances) ou que les entrées pourraient provenir de POM parent.

Ma deuxième idée était de construire une sorte de projet Maven artificiel et de rassembler les dépendances avec mvn dependency:tree. Cela pourrait devenir compliqué.

Quel serait le moyen le plus direct (mais aussi fiable) ?

5voto

Tunaki Points 2663

En dehors d'un plugin Maven, vous pouvez le faire de manière programmatique en utilisant Aether. Il existe une méthode readArtifactDescriptor qui fait exactement cela :

Obtient des informations sur un artefact telles que ses dépendances directes et les relocalisations potentielles.

Tout d'abord, ajoutez les dépendances Aether à votre POM :

        org.eclipse.aether
        aether-impl
        ${aetherVersion}

        org.eclipse.aether
        aether-connector-basic
        ${aetherVersion}

        org.eclipse.aether
        aether-transport-file
        ${aetherVersion}

        org.eclipse.aether
        aether-transport-http
        ${aetherVersion}

        org.apache.maven
        maven-aether-provider
        ${mavenVersion}

    1.1.0
    3.3.9

Ensuite, vous pouvez avoir :

public static void main(final String[] args) throws Exception {
    DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
    RepositorySystem system = newRepositorySystem(locator);
    RepositorySystemSession session = newSession(system);

    RemoteRepository central = new RemoteRepository.Builder("central", "default", "http://repo1.maven.org/maven2/").build();

    Artifact artifact = new DefaultArtifact("groupId:artifactId:version");
    ArtifactDescriptorRequest request = new ArtifactDescriptorRequest(artifact, Arrays.asList(central), null);
    ArtifactDescriptorResult result = system.readArtifactDescriptor(session, request);

    for (Dependency dependency : result.getDependencies()) {
        System.out.println(dependency);
    }
}

private static RepositorySystem newRepositorySystem(DefaultServiceLocator locator) {
    locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
    locator.addService(TransporterFactory.class, FileTransporterFactory.class);
    locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
    return locator.getService(RepositorySystem.class);
}

private static RepositorySystemSession newSession(RepositorySystem system) {
    DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
    LocalRepository localRepo = new LocalRepository("target/local-repo");
    session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
    // set possible proxies and mirrors
    session.setProxySelector(new DefaultProxySelector().add(new Proxy(Proxy.TYPE_HTTP, "host", 3625), Arrays.asList("localhost", "127.0.0.1")));
    session.setMirrorSelector(new DefaultMirrorSelector().add("my-mirror", "http://mirror", "default", false, "external:*", null));
    return session;
}

Ce que cela fait, c'est créer un système de dépôt Aether et lui dire de lire le descripteur de l'artefact d'un artefact donné. L'artefact est construit avec le constructeur new DefaultArtifact("...") en lui donnant les coordonnées voulues.

Un objet de requête est créé avec cet artefact et la liste des dépôts à partir desquels le récupérer. Dans l'exemple ci-dessus, seul Maven Central a été ajouté, mais vous pourriez ajouter d'autres RemoteRepository en les créant avec la classe RemoteRepository.Builder. Après avoir appelé readArtifactDescriptor, le résultat contient la liste des dépendances directes, qui peuvent être récupérées avec [getDependencies()](http://download.eclipse.org/aether/aether-core/0.9.0/apidocs/org/eclipse/aether/resolution/ArtifactDescriptorResult.html#getDependencies()).

Les proxies et les miroirs peuvent être configurés à l'aide du DefaultProxySelector et du DefaultMirrorSelector respectivement. DefaultProxySelector.add prend un Proxy en argument, qui peut être créé avec son constructeur en lui passant son type (comme "http"), hôte, port et éventuellement une Authentication (consultez la classe AuthenticationBuilder pour créer des objets d'authentification), et une liste d'hôtes non proxyfiés. De la même manière, DefaultMirrorSelector.add prend son identifiant, URL, type (qui est "default" pour Maven, mais vous pourriez avoir P2 par exemple), s'il s'agit d'un gestionnaire de dépôts, les identifiants de dépôts réellement miroités (selon la spécification de miroir), et le type de dépôt non miroité.

0voto

JF Meier Points 7713

Le flux de travail suivant semble être correct :

  1. Téléchargez le pom depuis Maven central, mettez-le dans un répertoire séparé et nommez-le pom.xml.

  2. Appliquez mvn dependency:list -DexcludeTransitive et récupérez la sortie de la console.

  3. Filtrez la liste des dépendances à partir de la sortie de la console.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X