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