Entwicklerspezifische Maven Properties

Problem
Oft gibt es bei Anwendungen bestimmte Properties welche von Entwickler zu Entwickler andere Werte aufweisen sollen, aber für das QA- oder Produktivsystem nur einen festen Wert haben.

Nehmen wir als Beispiel eine Anwendung die Status-Mails an eine bestimmte Adresse schicken soll. Gerade wenn mehrere Entwickler an einer Anwendung arbeiten sollten die Mails während der Entwicklung immer an den entsprechenden Entwickler gehen — und das am besten automatisiert ohne händisches eingreifen.

Lösung
Dies kann man über globale Maven Properties erreichen, die jeder Entwickler einmal auf seinem System einrichtet.
In globalen Maven Properties können Entwickler einmal Einstellungen festlegen die auf ihrem System fest sind und für alle Anwendungen, die dort entwickelt werden gleich sein sollen.

Ein großer Vorteil ist, dass die Änderungen nicht immer wieder händisch nachgezogen werden müssen. Gerade bei Verwendung von Subversion werden Änderungen oft versehentlich beim Updaten überbügelt oder beim Einchecken versehentlich anderen Entwicklern untergejubelt.

Beispiel
Das Beispiel unten legt eine Email Property fest, die dann dazu verwendet werden kann beim lokalen Entwickeln alle Anwendungen Emails nur an den Entwickler schicken zu lassen.

~/.m2/settings.xml

<settings>
    <profiles>
        <profile>
            <id>globalProps</id>
            <properties>
                <user.email>vorname.nachname@rrze.uni-erlangen.de</user.email>
            </properties>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>globalProps</activeProfile>
    </activeProfiles>
</settings>

Um für den Produktivbetrieb eine andere Adresse zu wählen übersetzt der Entwickler die Anwendung unter Verwendung eines anderen Profils, zB prod und setzt dort eine andere Adresse.

Im POM kann man die user.email Property zB so verwenden:
pom.xml

<project>

    <properties>
                 <!--
			Use globally configured user email for sending log4j messages via
			SMTP by default
		-->
		<log4j.smtp.recipients>${user.email}</log4j.smtp.recipients>
    </properties>

    <profiles>
		<profile>
			<id>prod</id>
			<properties>
				<log4j.smtp.recipients>[PROD-MAIL]</log4j.smtp.recipients>
			</properties>
		</profile>
	</profiles>

</project>

Ausblick
Die Property log4j.smtp.recipients kann dann im Anschluss durch Maven Resource Filtering automatisch in die log4j.properties Datei eingefügt werden.

Konfiguration des Resource Filtering in Maven:
pom.xml

<project>
	<build>
		<resources>

			<resource>
				<directory>src${file.separator}main${file.separator}resources</directory>
				<filtering>true</filtering>
				<includes>
					<include>**${file.separator}*.xml</include>
					<include>*.xml</include>
					<include>**${file.separator}*.properties</include>
					<include>*.properties</include>
				</includes>
			</resource>

			<resource>
				<directory>src${file.separator}main${file.separator}resources</directory>
				<filtering>false</filtering>
				<excludes>
					<exclude>**${file.separator}*.xml</exclude>
					<exclude>*.xml</exclude>
					<exclude>**${file.separator}*.properties</exclude>
					<exclude>*.properties</exclude>
				</excludes>
			</resource>

		</resources>
	</build>
</project>