Jak zastąpić pliki w pliku WAR podczas kompilacji Maven?
Mam projekt webapp Java, który rozwijam w Eclipse (dokładniej MyEclipse 10) i buduję za pomocą Maven 3.
Mam następujący układ (w tym tylko pliki związane z moim problemem:
project root
|-- src
| |-- main
| | |-- java
| | |-- resources
| | | |-- log4j.xml
| | | +-- struts.properties
| | |-- webapp
| | | |-- META-INF
| | | | +--context.xml
| | |-- config
| | | |-- test
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| | | +-- prod
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| +--test
+--pom.xml
Jak widać, załączyłem kilka plików konfiguracyjnych. Ten, który znajduje się we właściwym miejscu w ramach projektu, tj. Wewnątrzsrc/main/resources
isrc/main/webapp
to te, których rutynowo używam, gdy pracuję w MyEclipse. Mogę użyć złączy MyEclipse, aby automatycznie zaktualizować wdrożenie na np. instancja Tomcat na moim komputerze dev. Po prostu klikam „uruchom serwer” i mogę debugować. Nie ma potrzeby używania Mavena w tym kontekście.
Następnie, gdy chcę zbudować wersję dla innego środowiska, takiego jak testowanie lub produkcja, uruchamiammvn -P test clean install
i buduje miłą WOJNĘ.
Moim celem jest zastąpienie plików konfiguracyjnych w ostatecznej wersji WAR przez tych, którzy są wsrc/config/{environment}/
.
Mam ustawione profile w moimpom.xml
:
<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Następnie próbuję skopiować te zasoby z określonego profilu (używającenvironment
zmienna) do właściwej lokalizacji wewnątrz WAR (lub folderu tymczasowego, który zostanie spakowany do WAR):
<webResources>
<resource>
<directory>/src/main/config/${environment}</directory>
<targetPath>META-INF/</targetPath>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/config/${environment}</directory>
<targetPath>WEB-INF/classes/</targetPath>
<includes>
<include>
struts.properties
</include>
<include>
log4j.xml
</include>
</includes>
</resource>
</webResources>
Teraz wydaje się, że działa, z wyjątkiem tego, że „standardowe” zasoby są kopiowane do katalogu PO tym, więc zastępują te pliki. Więc zawsze kończę na np.log4j.xml
zsrc/main/resources
zamiast tego z powiedzeniasrc/main/configuration/prod/
Wyciąg z wyjścia Maven:
[INFO] Processing war project
[INFO] Copying webapp webResources [D:\workspace\MyProject/src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp webResources [D:\workspace\MyProject\src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp resources [D:\workspace\MyProject\src\main\webapp]
Jak widać na ostatniej linii, rzeczy zsrc/main/webapp
jest kopiowany PO, tym samym nadpisując moje pliki niestandardowe :(
Moje pytanie: jak zmusić Mavena do używania plików „z aktywowanego profilu” i jakoś PRZEGRĄĆ „naturalne” pliki?