lo hice :-)
ayuda: efectivo-pom y dependencia: Árbol realmente hizo no ayuda en absoluto.
Tuve que ver cómo maven construye el Modelo para el MavenProject que se inyecta en el mojo. help: effective-pom ya recibe el Modelo resuelto, y la dependencia: tree solo crea un DependencyGraph, pero no carga todo el modelo para un pom en la memoria.
Al usar el código siguiente, pude obtener un objeto Modelo con toda la información del padre, con expresiones $ {property} resueltas y dependencias transitivas ampliadas.
Así es como:
1) Obtener una ModelResolver
Usted necesitará una instancia de interfaz de org.apache.maven.model.resolution.ModelResolver. Desafortunadamente, maven no proporciona una inyección de dependencia fácilmente (al menos no pude encontrar una), así que tendremos que crear una. Para hacer las cosas aún mejor, las únicas dos implementaciones de esa interfaz están protegidas por paquete, por lo que debe usar alguna magia de reflexión para crear una instancia. Las clases concretas que lo implementan son DefaultModelResolver y ProjectModelResolver. que fue capaz de construir una DefaultModelResolver como esto
/**
* The Maven Project Object
*
* @parameter expression="${project}"
* @required2.0
* @readonly
*/
protected MavenProject project;
/**
* @component
*/
protected ArtifactResolver artifactResolver;
/**
* @component
*/
protected RemoteRepositoryManager remoteRepositoryManager;
private Object invoke(Object object, String method)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
return object.getClass().getMethod(method).invoke(object);
}
private org.apache.maven.model.resolution.ModelResolver makeModelResolver() throws MojoExecutionException {
try {
ProjectBuildingRequest projectBuildingRequest =
(ProjectBuildingRequest) invoke(project, "getProjectBuildingRequest");
Class c = Class.forName("org.apache.maven.repository.internal.DefaultModelResolver");
Constructor ct = c.getConstructor(new Class[]{RepositorySystemSession.class,
RequestTrace.class, String.class,
ArtifactResolver.class, RemoteRepositoryManager.class,
List.class});
ct.setAccessible(true);
return (org.apache.maven.model.resolution.ModelResolver) ct.newInstance(new Object[]{
projectBuildingRequest.getRepositorySession(),
null, null, artifactResolver, remoteRepositoryManager,
project.getRemoteProjectRepositories()});
} catch (Exception e) {
throw new MojoExecutionException("Error instantiating DefaultModelResolver", e);
}
}
2) construir el modelo
Cuando se tiene un modelResolver, se puede construir el modelo de un archivo pom así:
public Model resolveEffectiveModel(File pomfile) {
try {
return modelBuilder.build(makeModelBuildRequest(pomfile)).getEffectiveModel();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private ModelBuildingRequest makeModelBuildRequest(File artifactFile) {
DefaultModelBuildingRequest mbr = new DefaultModelBuildingRequest();
mbr.setPomFile(artifactFile);
mbr.setModelResolver(modelResolver); // <-- the hard-to-get modelResolver
return mbr;
}
No se ve bonito, pero funcionó para mí ..: P
¿Puedes elaborar un poco sobre las reglas de validación? – khmarbaise