26. dubna 2012

Maven, buildovací a konfigurační profily

Shodou okolností jsem teď byl v jednom týdnu vypomáhat na dvou projektech jako jako "problem solver", kde jsem mmj. řešil věci kolem Mavenu. V obou případech bylo potřeba vytvořit buildovací profily pro konfiguraci na různá prostředí. Chtěl bych si tady na jednom místě shrnout, jak nastavit Maven pro konfiguraci resources a webResources.

Správa konfigurací se dá v Mavenu řešit různými způsoby (řekl bych, že dost často se to dělá přes maven-antrun-plugin). Já jsem aktuálně použil filtering. Zadání je jednoduché - mám konfigurační properties soubor a potřebuju v něm mít jiné hodnoty pro různá prostředí, např. DEV a TEST.

Filtrování resources
Filtrování v Mavenu funguje následovně. Do standardního layoutu přidám adresář src/main/filters a v něm jsou filtrovací properties soubory s vkládanými hodnotami (je potřeba použít "plain" properties - s XML properties to v Mavenu nefunguje). V adresáři src/main/resources pak mám "normální" properties soubory s placeholdery pro vložení hodnot. Placeholder má formát ${property.klíč}.

Layout projektu
Obsah souboru default.properties:
my.filter.value=world
Obsah souboru hello.txt:
Hello, ${my.filter.value}!
Aby došlo k filtrování, je potřeba je mít v pom.xml zapnuté a mít uvedenou cestu k filtrovacímu souboru:
<build>
  <filters>
    <filter>
      src/main/filters/default.properties
    </filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>
Pokud teď pustíme zpracování resources příkazem:
  • mvn resources:resources
najdeme v adersáři target/classes soubor hello.txt s nově vloženou hodnotou:
Hello, world!

Buildovací profily
V předešlé sekci jsme do properties souboru vložili definovanou hodnotu (můžeme ji nazývat defaultní). Pro vložení jiné hodnoty je potřeba vytvořit profil v souboru pom.xml:
<profiles>
  <profile>
    <id>profile-1</id>
    <build>
      <filters>
        <filter>
          src/main/filters/profile-1.properties
        </filter>
      </filters>
    </build>
  </profile>
</profiles>
Profil zapneme přepínačem -P <profil>:
  • mvn resources:resources -P profile-1
Za předpokladu, že soubor profile-1.properties vypadá takto:
my.filter.value=profile-1 world
najdeme v souboru target/classes/hello.txt nově vloženou hodnotu:
Hello, profile-1 world!

Filtrování webResources
Výše uvedený postup funguje pouze nad adresářem src/main/resources. Pokud chceme totéž provést v adresáři s web resources (WEB-INF atd.), musíme nakonfigurovat obdobným způsobem maven-war-plugin:
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <webResources>
          <resource>
            <directory>
              src/main/webapp/WEB-INF
            </directory>
            <targetPath>WEB-INF</targetPath>
            <filtering>true</filtering>
            <includes>
              <include>web.xml</include>
            </includes>
          </resource>
        </webResources>
      </configuration>
    </plugin>
  </plugins>
  <filters>
    <filter>
      src/main/filters/default.properties
    </filter>
  </filters>
</build>
Pro úplnost ještě doplním layout projektu:

Layout web projektu

Žádné komentáře:

Okomentovat