2016-02-13 3 views
2

Я пишу плагин Maven 3, который должен знать транзитивные зависимости заданного org.apache.maven.model.Dependency. Как я могу это сделать?Найти зависимости объекта Maven Dependency

+1

Какова цель плагина? Взгляните на код maven-dependency-plugin ... Кроме того, вы не определили DependencyResolution на mojo? – khmarbaise

+1

Вам нужно больше, чем 'Dependency'. Вам нужен доступ к 'MavenProject', поскольку разрешенные транзитивные зависимости зависят от возможного разрешения конфликтов. – Tunaki

+0

@Tunaki Я нахожусь в плагине Maven 3, так что у меня тоже есть MavenProject. –

ответ

1

Итак, следующий код должен дать вам представление, как это сделать.

@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 будет работать для любого артефакта, который не является частью вашего проекта ... Вопрос в том, что вам действительно нужно?

5

В 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> 
+1

Несмотря на то, что он не использует класс Dependency, но класс DependencyNode, пример сделал именно то, что я искал, и поэтому должен быть принятым ответом. – codewing

Смежные вопросы