API Maven Plugin: получить MavenProject от артефакта

Я пытаюсь извлечь информацию обо всех зависимостях (рекурсивно), используемых в моем проекте. Кажется, класс MavenProject предоставляет всю необходимую мне информацию. Но я не могу понять, как преобразовать экземпляр Artifact в экземпляр MavenProject

/**
 * 
 *
 * @reqiresDependencyResolution
 *
 */
@Mojo(name = "license-overview", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {


    /**
     * @parameter default-value="${project}"
     * @required
     * @readonly
     */
    MavenProject project;


    public void execute() throws MojoExecutionException {

        Set<Artifact> artifacts= project.getArtifacts();
        for (Artifact artifact : artifacts) {
            //Here I need to access the artifact name, license, author, etc.
            System.out.println("*** "+artifact.getArtifactId()+"***");
        }

    }
}

Как получить доступ к информации, находящейся в папке моей зависимости, но не экспортироваться с помощью Artifact getters?

Ответ 1

Да, это возможно.

Мы можем построить проект в памяти с помощью ProjectBuilder API:

Создает описания объектов в памяти.

Вызывая метод build(projectArtifact, request) с интересующим нас артефактом и ProjectBuildingRequest (который содержит различные параметры, такие как расположение удаленных/локальных репозиториев и т.д.), это приведет к созданию MavenProject в памяти.

Рассмотрим следующее MOJO, которое будет печатать имя всех зависимостей:

@Mojo(name = "foo", requiresDependencyResolution = ResolutionScope.RUNTIME)
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
    private ProjectBuilder projectBuilder;

    public void execute() throws MojoExecutionException, MojoFailureException {
        ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
        try {
            for (Artifact artifact : project.getArtifacts()) {
                buildingRequest.setProject(null);
                MavenProject mavenProject = projectBuilder.build(artifact, buildingRequest).getProject();
                System.out.println(mavenProject.getName());
            }
        } catch (ProjectBuildingException e) {
            throw new MojoExecutionException("Error while building project", e);
        }
    }

}

Здесь есть несколько основных ингредиентов:

  • requiresDependencyResolution сообщает Maven, что мы требуем, чтобы зависимости были разрешены перед выполнением. В этом случае я указал его на RUNTIME, чтобы разрешить все зависимости компиляции и времени выполнения. Вы можете, конечно, установить это на ResolutionScope. вы хотите.
  • Конструктор проекта вводится аннотацией @Component.
  • Запрос здания по умолчанию строит с параметром текущего сеанса Maven. Нам просто нужно переопределить текущий проект, явно установив его на null, иначе ничего не произойдет.

Когда у вас есть доступ к MavenProject, вы можете распечатать всю информацию, которая вам нужна, например разработчики и т.д.

Если вы хотите распечатать зависимости (прямые и транзитивные), вам также потребуется вызвать setResolveDependencies(true) в запросе на строительство, иначе, они не будут заполнены в построенном проекте.