2010-01-25 19 views
17

Nel mio progetto di lavoro mi è stato recentemente chiesto di generare file POM tramite una classe java. Il problema è che sono molto, molto nuovo a Maven (come lo scorso dicembre).Esiste una classe Java che genera un file POM.xml?

Quello che mi serve è un codice in qualche modo che genera un file xml (un file pom, ma se posso configurare qualsiasi codice di creazione xml che andrà bene) dati tutti i dati necessari, quindi non è necessario scriverlo a mano. Non so se sto spiegando me stesso, ma la domanda è, c'è qualche libreria o classe che genera o costruisce un file POM con un dato dato? Se non va bene, non voglio perdere più tempo a cercare qualcosa che non so se esiste o se è semplice come dichiarare un oggetto POM e poi fare un documento banale d = generatePom (POM p). Dato che nessuno si lamenta di quanto sia difficile scrivere file POM, suppongo che ci sia un modo semplice per farli, ma penso di essermi perso in un sacco di API javadoc e non riesco a trovare la strada per tornare indietro.

La mia idea se non vi è alcun codice per questo è cercare il dizionario POM (per coprire tutti gli elementi) e creare un file xml con un oggetto POM dato (che avevo precedentemente compilato con i dati forniti), utilizzando un generatore XML come JDOM, XOM o XStream. Qualsiasi pensiero su questo sarebbe apprezzato se non esiste una classe che già fa questo (come 'hey! Stai facendo SBAGLIARLO').

PS: Ho letto che il progetto Eclipse sta facendo alcune cose di Maven e che ha un'API che genera un file pom.xml per il progetto attuale che hai. Sarebbe una grande cosa se potessi scavalcare i dati di input o qualcosa del genere.

Grazie per tutto!

risposta

37

Dipende da ciò che si sta cercando di fare. Se vuoi solo creare POM per nuovi progetti di un certo tipo, il modo migliore è attraverso gli archetipi di Maven (puoi creare i tuoi archetipi con i modelli che desideri).

Se davvero avete la necessità di scrivere codice un POM, è possibile utilizzare il seguente:

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); 

... dove w è una java.io.Writer e si aggiunge tutta la gestione delle eccezioni necessarie.

Il Javadoc è qui: http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

Per accedere a questa API, si dovrebbe aggiungere questa dipendenza:

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

C'è un corrispondente API letto pure, ma tenere a mente che non lo farà fai tutte le operazioni di Maven come l'ereditarietà e l'interpolazione (per farlo è necessario un uso più avanzato dell'API).

+0

Wow! Voglio dire ... questo è in realtà quello che stavo cercando. Posso davvero fare tutti i setter e scrivere il file pom.xml ovunque io voglia. Ho provato un po 'questa libreria e sembra fare meraviglie. Grazie davvero! :) – Random

+3

Se vi state chiedendo come Brett lo sappia, è perché ha scritto Apache Maven2: Implementazione efficace: http://brettporter.wordpress.com/ –

+0

Questo è fantastico. Grazie mille per il suggerimento. Questa libreria è abbastanza utile ... !!! –

1

Perché devi farlo in java anziché utilizzare uno strumento esistente come m2eclipse.
Vedere guide per creare un POM per un progetto esistente utilizzando m2eclipse.

Si potrebbe anche vedere il m2eclipse developer guide che ti permetterà di vedere il codice sorgente per la loro implementazione.

Risposta ----
Questo è un problema comune riscontrato durante il tentativo di salvare un progetto.
Il più grande ostacolo sta tentando di identificare il corretto maven coordinates.
Spesso i progetti si riferiscono a file jar rinominati, in cui l'ID di gruppo e i numeri di versione sono stati rimossi.

A volte l'ispezione del manifest nel file jar fornisce alcuni suggerimenti sul corretto artefatto dipendente.

+0

L'idea non è generare solo il pom.xml del progetto che sto lavorando, ma generare un file pom.xml di qualsiasi progetto. Capisco che memorizzano i dati necessari e poi me li danno per creare il pom. Non so come archiviano questi dati (o perché non generano semplicemente un pom invece di memorizzarlo) So solo che lo sto per ricevere (bussines modulare hurray). Grazie per le guide guarderei cosa posso fare con il loro codice :) – Random

+0

Grazie per il consiglio :) Anche se mi vengono dati questi dati, spero che siano corretti e reali. Ad ogni modo, avrò problemi con le coordinate di Maven, quindi esaminerò come vengono dati i dati e suppongo che sarebbe un qualche tipo di problema di connessione (ma spero che non accada!). La risposta data da Brett Porter era proprio ciò di cui avevo effettivamente bisogno. Spero davvero che non ci siano più problemi :) – 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);; 

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

se sto ancora bloccato se devo aggiungere più (numero imprecisato di) dipendenze.

Problemi correlati