Java-код для получения Maven Dependency Graph

Одним из требований к программе, над которой я работаю, является то, что мне нужно иметь возможность просматривать зависимости Maven нескольких артефактов в репозитории, чтобы я мог создавать для них графики зависимостей. Хотя очевидно, что Maven и Eclipse Aether могут сделать это (поскольку огромная часть Maven получает зависимости), мне действительно трудно понять, как это сделать в Java-программе.

Какие-либо предложения?

3 ответа

Похоже, что эфир может помочь, согласно документации. Есть даже пример, который демонстрирует, как использовать эфир для сбора транзитивных зависимостей артефакта. Объединяя это с примером API Maven здесь, я думаю, вы можете получить, где вы хотите.

Есть несколько способов сделать это: использовать IDE, например Eclipse... или вы можете использовать плагин maven-dependency-plugin, просто распечатав его в консоли...

mvn dependency:tree

Посмотрев на различные примеры и код, я собрал воедино следующее, что, похоже, работает:

public List<Artifact> fetchArtifactDependencies(final RepositorySystemSession session,
                                                final Artifact artifact,
                                                final DependencyFilter dependencyFilter)
        throws RepositoryException {

    final CollectRequest collectRequest = new CollectRequest();
    collectRequest.setRoot(new Dependency(artifact, "compile"));
    collectRequest.addRepository([repository]);

    final DependencyNode node = repositorySystem.collectDependencies(session, collectRequest)
                                                .getRoot();

    final DependencyRequest dependencyRequest = new DependencyRequest();
    dependencyRequest.setRoot(node);
    dependencyRequest.setFilter(dependencyFilter);

    final DependencyResult dependencyResult = repositorySystem.resolveDependencies(session,
                                                                                   dependencyRequest);

    final List<ArtifactResult> artifactResults = dependencyResult.getArtifactResults();

    final List<Artifact> results = new ArrayList<>(artifactResults.size());

    CollectionUtils.collect(artifactResults, new Transformer<ArtifactResult, Artifact>() {
        @Override
        public Artifact transform(final ArtifactResult input) {
            return input.getArtifact();
        }
    }, results);

    return results;
}
Другие вопросы по тегам