Я пишу плагин Maven 3, который должен знать транзитивные зависимости заданного org.apache.maven.model.Dependency
. Как я могу это сделать?Найти зависимости объекта Maven Dependency
ответ
Итак, следующий код должен дать вам представление, как это сделать.
@Mojo(name = "test", requiresDependencyResolution = ResolutionScope.COMPILE, defaultPhase = LifecyclePhase.PACKAGE ...)
public class TestMojo
extends AbstractMojo
{
@Parameter(defaultValue = "${project}", readonly = true)
private MavenProject project;
public void execute()
throws MojoExecutionException, MojoFailureException
{
List<Dependency> dependencies = project.getDependencies();
for (Dependency dependency : dependencies)
{
getLog().info("Dependency: " + getId(dependency));
}
Set<Artifact> artifacts = project.getArtifacts();
for (Artifact artifact : artifacts)
{
getLog().info("Artifact: " + artifact.getId());
}
}
private String getId(Dependency dep) {
StringBuilder sb = new StringBuilder();
sb.append(dep.getGroupId());
sb.append(':');
sb.append(dep.getArtifactId());
sb.append(':');
sb.append(dep.getVersion());
return sb.toString();
}
}
Приведенный выше код предоставит вам разрешенные артефакты, а также зависимости. Вам нужно сделать разницу между зависимостями (в этом случае зависимостями проекта без транзитивных и артефактов, которые являются решенными артефактами, включая переходные.).
Важнейшим является requiresDependencyResolution = ResolutionScope.COMPILE
, иначе вы получите null
за getArtifacts()
.
Предложение Tunaki будет работать для любого артефакта, который не является частью вашего проекта ... Вопрос в том, что вам действительно нужно?
В Maven 3, получить доступ ко всем зависимостей в виде дерева на основе формы, опираясь на maven-dependency-tree
общего компонента:
Дерево на основе API для разрешения зависимостей проекта Maven.
Этот компонент представляет DependencyGraphBuilder
, который может построить дерево зависимостей для данного проекта Maven. Вы также можете фильтровать артефакты с помощью ArtifactFilter
, который имеет пару встроенных реализаций для фильтрации по groupId, artifactId (IncludesArtifactFilter
и ExcludesArtifactFilter
), scope (ScopeArtifactFilter
) и т. Д. Если размер шрифта null
, все зависимости сохранены.
В вашем случае, поскольку вы нацеливаете определенный артефакт, вы можете добавить IncludesArtifactFilter
с рисунком groupId:artifactId
вашего артефакта. Пример кода будет следующим:
@Mojo(name = "foo")
public class MyMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
@Parameter(defaultValue = "${session}", readonly = true, required = true)
private MavenSession session;
@Component(hint = "default")
private DependencyGraphBuilder dependencyGraphBuilder;
public void execute() throws MojoExecutionException, MojoFailureException {
ArtifactFilter artifactFilter = new IncludesArtifactFilter(Arrays.asList("groupId:artifactId"));
ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
buildingRequest.setProject(project);
try {
DependencyNode rootNode = dependencyGraphBuilder.buildDependencyGraph(buildingRequest, artifactFilter);
CollectingDependencyNodeVisitor visitor = new CollectingDependencyNodeVisitor();
rootNode.accept(visitor);
for (DependencyNode node : visitor.getNodes()) {
System.out.println(node.toNodeString());
}
} catch (DependencyGraphBuilderException e) {
throw new MojoExecutionException("Couldn't build dependency graph", e);
}
}
}
Это дает доступ к корневому узлу дерева зависимостей, которое является текущим проектом. С этого узла вы можете получить доступ ко всем детям, вызвав метод getChildren()
. Поэтому, если вы хотите перечислить все зависимости, вы можете перевести этот граф рекурсивно. Этот компонент обеспечивает возможность для этого с помощью CollectingDependencyNodeVisitor
. Он будет собирать все зависимости в List
, чтобы легко пропустить его.
Для плагин Maven, следующая зависимость, поэтому необходимо:
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-dependency-tree</artifactId>
<version>3.0</version>
</dependency>
Несмотря на то, что он не использует класс Dependency, но класс DependencyNode, пример сделал именно то, что я искал, и поэтому должен быть принятым ответом. – codewing
- 1. Найти maven dependency "com.sun.javadoc"
- 2. Maven NAR Dependency - Не удалось разрешить зависимости
- 3. Maven Uberjar as Maven Dependency
- 4. Maven не может найти зависимости Struts2
- 5. maven dependency clash
- 6. Как найти зависимости от maven любого проекта?
- 7. Maven dependency - Maven Проект установки/обновления
- 8. Ошибка Maven Dependency в pom.xml
- 9. Maven Shared Dependency
- 10. тест Maven зависимости от зависимости
- 11. Получить собственность от Maven Dependency
- 12. Maven: Pofile: dependency Повторение
- 13. Maven Eclipse Runtime Plugin Dependency
- 14. maven-dependency-plugin: unpack Ошибка
- 15. Maven Dependency Issue: не удалось разрешить зависимости для проекта
- 16. Gradle Dependency loading from maven
- 17. Механизм зависимости Dependency
- 18. Maven зависимости для org.apache.poi.POIXMLDocument
- 19. Maven Dependency Resolution
- 20. maven dependency war issue
- 21. org.apache.commons.io.input.Tailer maven dependency
- 22. Maven Dependency Nightmare
- 23. Maven Переходная Dependency вопрос
- 24. OpenCV Java Maven dependency
- 25. Что такое Maven Dependency?
- 26. Устранение конфликтов зависимости Maven?
- 27. Maven ошибка - разрешение зависимости
- 28. Maven не копирует зависимости
- 29. GWT проекта (Maven): Dependency конфликт
- 30. зависимости Maven Eclipse,
Какова цель плагина? Взгляните на код maven-dependency-plugin ... Кроме того, вы не определили DependencyResolution на mojo? – khmarbaise
Вам нужно больше, чем 'Dependency'. Вам нужен доступ к 'MavenProject', поскольку разрешенные транзитивные зависимости зависят от возможного разрешения конфликтов. – Tunaki
@Tunaki Я нахожусь в плагине Maven 3, так что у меня тоже есть MavenProject. –