Обычно, я нахожу, что лучший выбор состоит в том, чтобы использовать STL с пользовательскими средствами выделения вместо того, чтобы заменить контейнеры STL скрученными вручную. Хорошая вещь о STL - Вы, платят только за то, что Вы используете.
Плагин зависимостей имеет целевое дерево , которое выполняет большую часть этой работы. Он обрабатывает 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();
}
}
Вы можете использовать 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, версия и т. д.