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

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 <profile>:

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

Layout web projektu