2012-01-02 27 views
12

Voglio definire un repository locale nel mio progetto di maven.come ottenere il super pom basedir in un modulo figlio?

Ho un super pom e diversi moduli figlio. La mia struttura del file è:

/root 
    /repository 
    /child 
     pom.xml 
    pom.xml 

nel mio super-pom mi definiscono:

<repository> 
    <id>my-local-repo</id> 
    <url>file://${basedir}/repository</url> 
</repository> 

Il problema è che nel mio pom bambino, il repository definito nel mio super pom si riferisce a/root/bambino/repository e così, le dipendenze non possono essere trovate ...

C'è un modo per definire un percorso sempre relativo al super pom?

In caso contrario, qual è il modo migliore per risolvere il problema?

+0

Così si vuole creare repository-per-progetto? Forse '$ {project.parent.relativePath}' sarà risolvibile (in più dovrai definire '' in tutte le POM di tuo figlio). –

risposta

4

${project.parent.basedir} dovrebbe fare il lavoro.

Oppure è possibile impostare il percorso basato sulla radice in una proprietà, in modo che venga ereditato. Qualcosa di simile nella controllante

<properties> 
    <rootPath>${basedir}</rootPath> 
</properties> 

E nel Bambino

<repository> 
    <id>my-local-repo</id> 
    <url>file://${rootPath}/repository</url> 
</repository> 
+3

grazie per la tua risposta, ma $ {basedir} in parent pom non viene eseguito perché è sostituito dal percorso pom figlio e $ {project.parent.basedir} non viene mai interpretato –

+2

True. Le proprietà vengono prima unite dal genitore, quindi elaborate. –

4

In questo caso, in un primo momento si potrebbe provare ${project.parent.basedir}.
Come sembra non funzionare, il modo semplice (e nativo) è usare il percorso completo (/ root/...) o provare il percorso relativo (../) invece di usare la variabile $ {basedir}.

Ma per me, un'ottima soluzione sarebbe esternalizzare questa configurazione in un file di proprietà.
È possibile utilizzare proprietà-maven-plug-in (http://mojo.codehaus.org/properties-maven-plugin/plugin-info.html).

Con questo plug-in, le proprietà definite nel file delle proprietà possono essere lette come le proprietà definite all'interno di pom.xml.

Dal sito plugin:

Se si dispone di un file di proprietà chiamato teams.properties con questo contenuto:

toronto=raptors 
miami=heat 

sarebbe la stessa di dichiarare quanto segue nel pom.xml:

<properties> 
    <toronto>raptors</toronto> 
    <miami>heat</miami> 
</properties> 
0

Ho risolto molte volte con il plugin Groovy. Aggiungi un file chiamato "basepath_marker" alla directory del tuo super-pom e aggiungi quanto segue al tuo pom. Puoi accedere alla proprietà in questo modo: $ {percorso-base}. Leggi this blog post per ulteriori dettagli.

Esempio:

... 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.gmaven</groupId> 
      <artifactId>groovy-maven-plugin</artifactId> 
      <executions> 
       <!-- set absolute base path from super pom --> 
       <execution> 
        <id>find-basepath</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>execute</goal> 
        </goals> 
        <configuration> 
         <source> 
          <![CDATA[ 
           import java.io.File; 
           log.info('## define projects super pom absolute path through basepath_marker') 
           String p = "basepath_marker"; 
           File f = null; 
           if(p != null) { 
            def _max_child_poms = 0 
            while(_max_child_poms++ < 5) { 
             f = new File(p); 
             if(f.exists()) { 
              break; 
             } 
             p = "../" + p;         
            } 
           } 
           if(f != null) { 
            String basePath = f.getCanonicalPath(); 
            basePath = basePath.substring(0, basePath.lastIndexOf(File.separator)); 
            project.properties['base-path'] = basePath.replace('\\' , '/'); 
            log.info(' - used base path = ' + project.properties['base-path']); 
           } else { 
            log.error('Could not find basepath_marker marker file!'); 
            System.stop(0); 
           } 
          ]]> 
         </source> 
        </configuration> 
       </execution>      
      </executions> 
     </plugin> 
    </plugins> 
</build> 
... 
Problemi correlati