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íč}
.
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: