Как получить доступ к иерархии зависимости Знатока в плагине

Обычно, я нахожу, что лучший выбор состоит в том, чтобы использовать STL с пользовательскими средствами выделения вместо того, чтобы заменить контейнеры STL скрученными вручную. Хорошая вещь о STL - Вы, платят только за то, что Вы используете.

36
задан Sled 12 March 2014 в 14:29
поделиться

2 ответа

Плагин зависимостей имеет целевое дерево , которое выполняет большую часть этой работы. Он обрабатывает MavenProject с помощью DependencyTreeBuilder , это возвращает DependencyNode с иерархической информацией о разрешенных зависимостях (и их транзитивных зависимостях).

Вы можете скопировать большая часть кода прямо из TreeMojo. Он использует CollectingDependencyNodeVisitor для обхода дерева и создания списка List всех узлов.

Вы можете получить доступ к Артефакту для узла, вызвав getArtifact () , а затем получить информацию об артефакте по мере необходимости. Чтобы узнать причину исключения, DependencyNode имеет метод getState () , который возвращает int, указывающий, была ли включена зависимость, или, если нет, по какой причине она была исключена (в классе DependencyNode есть константы для проверьте возвращаемое значение по)

//All components need this annotation, omitted for brevity

/**
 * @component
 * @required
 * @readonly
 */
private ArtifactFactory artifactFactory;
private ArtifactMetadataSource artifactMetadataSource;
private ArtifactCollector artifactCollector;
private DependencyTreeBuilder treeBuilder;
private ArtifactRepository localRepository;
private MavenProject project;

public void execute() throws MojoExecutionException, MojoFailureException {
    try {
        ArtifactFilter artifactFilter = new ScopeArtifactFilter(null);

        DependencyNode rootNode = treeBuilder.buildDependencyTree(project,
                localRepository, artifactFactory, artifactMetadataSource,
                artifactFilter, artifactCollector);

        CollectingDependencyNodeVisitor visitor = 
            new CollectingDependencyNodeVisitor();

        rootNode.accept(visitor);

        List<DependencyNode> nodes = visitor.getNodes();
        for (DependencyNode dependencyNode : nodes) {
            int state = dependencyNode.getState();
            Artifact artifact = dependencyNode.getArtifact();
            if(state == DependencyNode.INCLUDED) {                    
                //...
            } 
        }
    } catch (DependencyTreeBuilderException e) {
        // TODO handle exception
        e.printStackTrace();
    }
}
29
ответ дан 27 November 2019 в 05:42
поделиться

Вы можете использовать MavenProject # getDependencyArtifacts () или MavenProject # getDependencies () (последний возвращает также транзитивные зависимости).

/**
 * Test Mojo
 *
 * @goal test
 * @requiresDependencyResolution compile
 */
public class TestMojo extends AbstractMojo {

    /**
     * The Maven Project.
     *
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project = null;

    /**
     * Execute Mojo.
     *
     * @throws MojoExecutionException If an error occurs.
     * @throws MojoFailureException If an error occurs.
     */
    public void execute() throws MojoExecutionException,
MojoFailureException {

        ...

        Set dependencies = project.getDependencies();

       ...
    }

}

Я не совсем уверен, но думаю, что оба метода возвращают коллекцию реализаций Artifact , которые предоставляют методы получения для groupId, artifactId, версия и т. д.

20
ответ дан 27 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: