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