2013-08-08 9 views
5

Jest properties katalog w moim projekcie:Jak zapętlać pliki w katalogu i wykonywać niektóre zadania na podstawie nazwy pliku?

properties 
    - project_dev.properties 
    - project_test.properties 
    - project_prod.properties 
    - project_other.properties 

który definiuje kilka różnych wartości dla różnych środowisk. Istnieje również katalog template, który zawiera szablony plików konfiguracyjnych z symbolami zastępczymi.

Co chcę zrobić jest do pętli wszystkich plików w properties i połączyć każdy jeden do katalogu template wygenerowania ostatecznych plików konfiguracyjnych, które są w różnych katalogach na podstawie nazwy pliku.

Tak będzie:

target 
    - configurations 
     - dev 
      - ... some files 
     - test 
      - ... some files 
     - prod 
      - ... some files 
     - other 
      - ... some files 

Co robię teraz jest użycie maven-resources-plugin i zdefiniować kilka execution s dla każdego z plików, a zakodowane nazwiska.

To wygląda następująco:

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
     <version>2.6</version> 
     <executions> 
      <!--- for dev ----> 
      <execution> 
       <id>dev-filter</id> 
       <phase>validate</phase> 
       <goals> 
        <goal>copy-resources</goal> 
       </goals> 
       <configuration> 
        <encoding>UTF-8</encoding> 
        <outputDirectory>${basedir}/target/conf/dev</outputDirectory> 
        <useDefaultDelimiters>false</useDefaultDelimiters> 
        <resources> 
         <resource> 
         <directory>${basedir}/conf/template</directory> 
         <filtering>true</filtering> 
         <includes> 
          <include>channel/*</include> 
          <include>rule-config/*</include> 
          <include>server/*.properties</include> 
         </includes> 
         </resource> 
        </resources> 
        <delimiters> 
         <delimiter>${*}</delimiter> 
        </delimiters> 
        <filters> 
         <filter>${basedir}/properties/project_dev.properties</filter> 
        </filters> 
       </configuration> 
      </execution> 
      <!--- for prod ----> 
      <execution> 
       <id>prod-filter</id> 
       <phase>validate</phase> 
       <goals> 
        <goal>copy-resources</goal> 
       </goals> 
       <configuration> 
        <encoding>UTF-8</encoding> 
        <outputDirectory>${basedir}/target/conf/prod</outputDirectory> 
        <useDefaultDelimiters>false</useDefaultDelimiters> 
        <resources> 
         <resource> 
         <directory>${basedir}/conf/template</directory> 
         <filtering>true</filtering> 
         <includes> 
          <include>channel/*</include> 
          <include>rule-config/*</include> 
          <include>server/*.properties</include> 
         </includes> 
         </resource> 
        </resources> 
        <delimiters> 
         <delimiter>${*}</delimiter> 
        </delimiters> 
        <filters> 
         <filter>${basedir}/properties/project_prod.properties</filter> 
        </filters> 
       </configuration> 
      </execution> 
      <!--- for test ---> 
      ... 

Widać jestem kopiowanie bloku execution dla każdego pliku, więc nie będzie wielu powielane kod z małymi różnicami.

Zastanawiam się, czy istnieje jakieś rozwiązanie, które uprości sprawę? Próbowałem znaleźć sposób na zapętlenie plików pod properties i wykonać zadanie dla każdego z nich, ale nie wiem, jak to zrobić.

Odpowiedz

6

Prostym rozwiązaniem dla takich celów jest Iterator-maven-plugin

<plugin> 
    <groupId>com.soebes.maven.plugins</groupId> 
    <artifactId>iterator-maven-plugin</artifactId> 
    <version>0.1.0</version> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>executor</goal> 
     </goals> 
     <configuration> 
     <items> 
      <item>dev</item> 
      <item>test</item> 
      <item>prod</item> 
     </items> 

     <pluginExecutors> 
      <pluginExecutor> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-resources-plugin</artifactId> 
       <version>2.6</version> 
      </plugin> 
      <goal>copy-resources</goal> 
      <configuration> 
       <outputDirectory>${basedir}/target/conf/@[email protected]</outputDirectory> 
       <useDefaultDelimiters>false</useDefaultDelimiters> 
       <resources> 
        <resource> 
        <directory>${basedir}/conf/template</directory> 
        <filtering>true</filtering> 
        <includes> 
         <include>channel/*</include> 
         <include>rule-config/*</include> 
         <include>server/*.properties</include> 
         </includes> 
        </resource> 
        </resources> 
        <delimiters> 
         <delimiter>${*}</delimiter> 
        </delimiters> 
        <filters> 
         <filter>${basedir}/properties/[email protected]@.properties</filter> 
        </filters> 
       </configuration> 
      </pluginExecutor> 
     </pluginExecutors> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Dokumentacja zawiera również example która jest bardzo podobna do swoich potrzeb.

Poza tym proponuję, aby użyć następujących właściwości w pliku pom:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

niż nie trzeba zdefiniować kodowanie oddzielnie dla Maven-resources-plugin.

Powiązane problemy