2012-01-04 20 views
7

Voglio usare Maven per sostituire alcuni dei miei file * .properties nel mio file di guerra.Risorse Maven non copia i file

Pertanto ho creato le cartelle dev, test e prod nella cartella delle risorse. Ora voglio solo avere una di queste cartelle utilizzate nel percorso della cartella risorse nel mio file di guerra quando si esegue il profilo corrispondente. Il risultato è che Maven sta copiando anche tutte le altre cartelle, quindi quelle sono doppie nel classpath. Qui è la mia configurazione:

<profile> 
     <id>dev</id> 

     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 

     <build> 
      <plugins> 
       <plugin> 
        <artifactId>maven-resources-plugin</artifactId> 
        <version>2.3</version> 
        <executions> 
         <execution> 
          <id>copy-dev-resources</id> 
          <phase>process-resources</phase> 
          <goals> 
           <goal>copy-resources</goal> 
          </goals> 
          <configuration> 

           <overwrite>true</overwrite> 

           <outputDirectory>${basedir}/target/classes</outputDirectory> 
           <resources> 
            <resource> 
             <!-- source --> 
             <directory>src/main/resources/dev</directory> 
            </resource> 
           </resources> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 

Come si configura Maven ora che il suo solo copiare il contenuto della cartella src/main/risorse/dev per target/classi?

Grazie per aiutare

risposta

7

Maven da copie di default tutti i file in "src/main/risorse" nella cartella di output, quindi nella configurazione corrente sarebbe probabilmente creare "dev", "test" e " prod "cartelle con i loro contenuti e quindi copiare anche le risorse di sviluppo senza un prefisso" dev ".

Suggerisco di lasciare la cartella delle risorse predefinite così com'è e usarla solo per risorse indipendenti dal profilo. Nel tuo profilo è possibile configurare ulteriori cartelle delle risorse:

<profile> 
    <id>dev</id> 
    <build> 
     <resources> 
      <resource> 
       <directory>${basedir}/src/main/resources-dev</directory> 
      </resource> 
     </resources> 
    </build> 
</profile> 

Dovrebbe anche essere possibile configurare questo nella sezione comune di compilazione utilizzando le proprietà definite nei profili:

<build> 
    <resources> 
     <resource> 
      <directory>${basedir}/src/main/resources-${projectStage}</directory> 
     </resource> 
    </resources> 
</build> 
<profiles> 
    <profile> 
     <id>dev</id> 
     <properties> 
      <projectStage>dev</projectStage> 
     </properties> 
    </profile> 
</profiles> 

Se per qualche ragione non può cambiare la struttura della directory corrente, allora si dovrebbe configurare le esclusioni per la cartella di risorse predefinito di non copiare il profilo-dipendente nidificati cartelle:

<build> 
     <resources> 
      <resource> 
       <directory>${basedir}/src/main/resources</directory> 
       <excludes> 
        <exclude>dev/**</exclude> 
        <exclude>test/**</exclude> 
        <exclude>prod/**</exclude> 
       </excludes> 
      </resource> 
     </resources> 
    </build> 
1

La parte "principale" nella struttura di directory maven esiste per questo scopo. Invece di creare directory all'interno della directory delle risorse, dovresti creare più directory nella directory src. Questo è il comportamento predefinito ed è già stato implementato consentendo alle risorse di test di sovrascrivere le risorse principali durante le fasi di test del ciclo di vita di Maven.

La vostra struttura dovrebbe essere simile a questo:

src 
    main 
    resources 
     a.properties 
     b.properties 
     c.properties 
    test 
    resources 
     b.properties 
     c.properties 
    dev 
    resources 
     b.properties 

Con questa struttura, il vostro obiettivo "principale" avrà i file delle proprietà di default, le fasi di test avrebbero temporaneamente sovrascrivere B e C, e il profilo dev solo la volontà sovrascrivi b con un'altra versione personalizzata, nel finale distribuibile.

Per ottenere ciò, è necessario configurare lo maven-resources-plugin come già si fa nella nostra domanda, per un profilo di sviluppo.

E quando lo fai, considera anche: quale versione dei file di proprietà dovresti usare quando esegui i test unit durante la costruzione usando il profilo dev?

0

stavo usando il file assembly.xml in Maven e usato questo set di codice per assicurarsi che il mio file di risorse era alla directory principale del app ...

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 

<id>distribution</id> 
<formats> 
    <format>tar.gz</format> 
</formats> 
<fileSets> 
    <fileSet> 
     <directory>${basedir}</directory> 
     <includes> 
      <include>bin/**</include> 
      <include>webapps/**</include> 
      <include>data/**</include> 
     </includes> 
    </fileSet> 
    <fileSet> 
     <directory>${basedir}/target</directory> 
     <includes> 
      <include>*.jar</include> 
     </includes> 
     <outputDirectory>lib</outputDirectory> 
    </fileSet> 
    <fileSet> 
     <directory>${basedir}/src/main/</directory> 
     <includes> 
      <include>resources/**</include> 
     </includes> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
</fileSets> 

<dependencySets> 
    <dependencySet> 
     <outputDirectory>lib</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
    </dependencySet> 
</dependencySets> 

    </assembly> 

Non so se questo è il modo migliore, ma era quello che potevo visualizzare.

Problemi correlati