Ответ 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)
в запросе на строительство, иначе, они не будут заполнены в построенном проекте.