Mariusz Prowaźnik

o programowaniu w Javie, Scali i Clojure.


Konfiguracja projektu z profilami Mavena i Springiem

W poście tym pokażę, jak przy użyciu Spring'a i profili Maven'a można uporządkować sobie konfigurację projektu, która jest zależna od środowiska na które jest wdrażany projekt. Oto przykładowe zastosowania:

Problem 1
Projekt korzysta konfigurowalnych zasobów, np z bazy danych. W pliku kontekstu Springa określiłem potrzebne namiary: url, port, użytkownika hasło. Chciałbym mieć to jednak w oddzielnym pliku, żeby w razie potrzeby te namiary zmienić, bez przeglądania dużego xml'a z konfiguracją.

Rozwiązanie
W tym celu można użyć PropertyPlaceholderConfigurer, dzięki któremu odpowiednie namiary pobrane zostaną z oddzielnego pliku. W pliku kontekstu określa się lokalizację pliku z właściwościami, zawierającego pary klucz=wartość.
context.xml
<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>
jdbc.properties
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

Problem 2
Aplikacja, którą projektuję jest wdrażana na różnych środowiskach (np. na testowym i deweloperskim) i na każdym z nich łączy się z inną bazą danych. Nie chcę za każdym razem ręcznie aktualizować właściwości źródła danych.

Rozwiązanie
Pewne właściwości można umieścić w pliku pom.xml w sekcji properties. Włączenie filtrowania zasobów przez Maven'a, poprzez podanie ścieżki do katalogu z zasobami w sekcji resource spowoduje, że, jeśli któryś z plików w zasobach zawiera klucze takie jak ${jdbc.password}, to zostaną one zastąpione przez wartości właściwości z pliku pom.xml. W poniższym przykładzie podałem katalog src/main/resources, w którym znajduje się plik kontekstu.
context.xml
<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

pom.xml
<properties>
  <jdbc.driverClassName>org.hsqldb.jdbcDriver</jdbc.driverClassName>
  <jdbc.username>user</jdbc.username>
  <jdbc.password>pass</jdbc.password>
 </properties>
 <build>
  <resources>
   <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
   </resource>
  </resources>
 </build>
Właściwości te mogą być różne dla różnych środowisk. Warto wtedy stworzyć profile mavena, a w nich właściwości specyficzne dla konkretnego środowiska:
<profiles>
  <profile>
   <id>prod</id>
   <properties>
    <jdbc.url>jdbc:hsqldb:hsql://production:9002</jdbc.url>
   </properties>
  </profile>
  <profile>
   <id>test</id>
   <properties>
    <jdbc.url>jdbc:hsqldb:hsql://testowa:9002</jdbc.url>
   </properties>
  </profile>
 </profiles>
Dzięki temu podczas budowania projektu można wybrać odpowiedni profil i automatycznie zostaną wybrane odpowiednie właściwości:
mvn clean install -P prod
Jeśli serwerem aplikacyjnym jest Tomcat, to warto wykorzystać profile do konfiguracji wdrażania aplikacji przez wtyczkę maven'a . Można też połączyć rozwiązanie pierwsze i drugie poprzez zamieszczenie we właściwościach pliku pom.xml jedynie nazwy plików dla PropertyPlaceholderConfigurer, by w zależności od profilu uwzględniany odpowiedni plik z właściwościami.

Brak komentarzy :

Prześlij komentarz