2010-01-25 11 views
17

En mi proyecto de trabajo, recientemente me han pedido que genere archivos POM a través de una clase Java. El problema es que soy muy, muy nuevo para Maven (como desde diciembre pasado).¿Hay una clase Java que genere un archivo POM.xml?

Lo que necesito es un código que genere un archivo xml (un archivo pom, pero si puedo configurar cualquier código de creación xml que sea correcto) con todos los datos necesarios, para que no tengan que escribirlo a mano. No sé si me estoy explicando, pero la pregunta es, ¿hay alguna biblioteca o clase que genere o construya un archivo POM con datos dados? Si no es así, simplemente no quiero perder más tiempo buscando algo que no sé si existe o si es tan simple como declarar un objeto POM y luego hacer un documento trivial d = generatePom (POM p). Como nadie se queja de lo difícil que es escribir archivos POM, supongo que debería haber una forma fácil de hacerlo, pero creo que me he perdido en muchos API javadoc y no puedo encontrar el camino de regreso.

Mi idea, si no hay un código para esto, es buscar el diccionario POM (para cubrir todos los elementos) y crear un archivo xml con un objeto POM dado (que previamente había rellenado con los datos que me proporcionan), usando un generador XML como JDOM, XOM o XStream. Cualquier idea sobre esto sería apreciada si no hay una clase que ya lo haga (como '¡hey! Lo estás haciendo mal').

PD: He leído que el proyecto Eclipse está haciendo algunas cosas Maven y que tiene una API que genera un archivo pom.xml para el proyecto real que tiene. Eso sería una gran cosa si pudiera anular los datos de entrada o algo así.

¡Gracias a todos!

Respuesta

37

Depende de lo que está tratando de hacer. Si solo desea crear POM para nuevos proyectos de un tipo seguro, la mejor manera es a través de los arquetipos de Maven (puede crear sus propios arquetipos con las plantillas que desee).

Si realmente tiene una necesidad de escribir programación un POM, se puede utilizar el siguiente:

import org.apache.maven.model.*; 
import org.apache.maven.model.io.xpp3.MavenXpp3Writer; 
... 
Model model = new Model(); 
model.setGroupId("some.group.id"); 
... 
new MavenXpp3Writer().write(w, model); 

... donde w es un java.io.Writer y se agrega todo el manejo de excepciones es necesario.

El Javadoc está aquí: http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

Para acceder a esta API, se debe añadir esta dependencia:

<dependency> 
    <groupId>org.apache.maven</groupId> 
    <artifactId>maven-model</artifactId> 
    <version>2.2.1</version> 
</dependency> 

Hay una API de lectura correspondientes, así, pero hay que tener en cuenta que no lo hará hacer todas las operaciones de Maven, como la herencia y la interpolación (para hacer eso se requiere un uso más avanzado de la API).

+0

¡Guau! Quiero decir ... eso es realmente lo que estaba buscando. Realmente solo puedo hacer todos los setters y escribir el archivo pom.xml en cualquier lugar que desee. He intentado un poco esta biblioteca y parece hacer maravillas. ¡Realmente gracias! :) – Random

+3

Si se está preguntando cómo Brett lo sabe, es porque escribió Apache Maven2: Implementación efectiva: http://brettporter.wordpress.com/ –

+0

Esto es increíble. Muchas gracias por la sugerencia. Esta biblioteca es bastante útil ... !!! –

1

¿Por qué tienes que hacerlo en Java en lugar de utilizar una herramienta existente como m2eclipse.
Vea guide para crear un POM para un proyecto existente usando m2eclipse.

También puede ver el m2eclipse developer guide que le permitirá ver el código fuente para su implementación.

Responder ----
Este es un problema común cuando se trata de mavenizar un proyecto.
El mayor obstáculo es tratar de identificar el maven coordinates correcto.
A menudo los proyectos se refieren a los archivos jar renombrados, donde se han eliminado la identificación de grupo y los números de versión.

A veces la inspección del manifiesto en el archivo jar proporciona algunas pistas sobre el artefacto dependiente correcto.

+0

La idea no es solo generar el pom.xml del proyecto en el que estoy trabajando, sino generar un archivo pom.xml de cualquier proyecto. Entiendo que almacenan los datos necesarios y luego me los dan para crear el pom. No sé cómo almacenan estos datos (o por qué simplemente no generan un pom en lugar de almacenarlo) Solo sé que debo recibirlo (hurrah bussines). Gracias por las guías me gustaría ver lo que puedo hacer con su código :) – Random

+0

Gracias por el consejo :) Aunque me dieron estos datos, espero que sean correctos y reales. De todos modos, si tengo problemas con las coordenadas de Maven, entonces inspeccionaré cómo se proporcionan los datos y supongo que sería algún tipo de problema de conexión (¡pero espero que eso no suceda!). La respuesta dada por Brett Porter fue justo lo que realmente necesitaba. Realmente espero que no haya más problemas :) – Random

3
 MavenXpp3Reader reader = new MavenXpp3Reader(); 
     Model pomModel = reader.read(new FileReader(pomLibFile)); 
     final List<Dependency> dependencies= pomModel.getDependencies(); 
     final List<String> modules= pomModel.getModules(); 
     final List<Profile> profiles = pomModel.getProfiles(); 

     InputStream inputStream = new FileInputStream(new File(pomLibFile)); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(inputStream, writer, "utf-8"); 
     pomModel.getDependencyManagement(); 
     final Properties properties = new Properties(); 
     properties.load(new FileInputStream(pomProperties)); 
     RegexBasedInterpolator interpolator = new RegexBasedInterpolator(); 

     interpolator.addValueSource(new EnvarBasedValueSource()); 
     interpolator.addValueSource(new PropertiesBasedValueSource(properties)); 

     List<String> synonymPrefixes = new ArrayList<String>(); 
     synonymPrefixes.add("project."); 
     synonymPrefixes.add("pom."); 

     PrefixedValueSourceWrapper modelWrapper = new PrefixedValueSourceWrapper(new ObjectBasedValueSource(pomModel),synonymPrefixes, true); 
     interpolator.addValueSource(modelWrapper); 

     PrefixedValueSourceWrapper pomPropertyWrapper = 
       new PrefixedValueSourceWrapper(new PropertiesBasedValueSource(pomModel.getProperties()), synonymPrefixes, true); 
     interpolator.addValueSource(pomPropertyWrapper); 

     interpolator.addValueSource(new PropertiesBasedValueSource(properties)); 

     RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor(synonymPrefixes, true); 

     String serializedPOM = interpolator.interpolate(writer.toString(), recursionInterceptor); 
     System.out.println("-------- "+serializedPOM);; 

Referencia: http://plexus.codehaus.org/plexus-components/plexus-interpolation/index.html

aunque todavía estoy atascado si tengo que añadir múltiples (número desconocido de dependencias).

Cuestiones relacionadas