Sì, questo è possibile.
Siamo in grado di costruire un progetto in-memory con la ProjectBuilder
API:
Costruisce descrizioni in memoria di progetti.
richiamando il metodo build(projectArtifact, request)
con l'artefatto che ci interessa ed un ProjectBuildingRequest
(che contiene vari parametri come la posizione dei repository remoti/locali, etc.), questo costruirà un MavenProject
in memoria.
Si consideri il seguente MOJO che stamperà il nome di tutte le dipendenze:
@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);
}
}
}
ci sono un paio di ingredienti principali qui:
- Il
requiresDependencyResolution
dice Maven che richiediamo le dipendenze a essere risolto prima dell'esecuzione. In questo caso, l'ho specificato a RUNTIME
in modo che tutte le dipendenze di compilazione e runtime siano risolte. Ovviamente è possibile impostarlo su ResolutionScope
. tu vuoi.
- Il builder del progetto viene iniettato con l'annotazione
@Component
.
- Una richiesta di costruzione predefinita viene creata con il parametro della sessione Maven corrente. Abbiamo solo bisogno di ignorare il progetto corrente impostandolo esplicitamente su
null
, altrimenti non accadrà nulla.
Quando si ha accesso al MavenProject
, è possibile stampare tutte le informazioni desiderate su di esso, come sviluppatori, ecc
Se si desidera stampare le dipendenze (diretto e transitivo), sarà inoltre è necessario invocare setResolveDependencies(true)
per la richiesta di costruzione, altrimenti non verranno compilati nel progetto creato.