# Maven2: Test und Prod Builds



## byte (13. Jul 2009)

Hi,

ich habe jetzt Maven2 soweit eingerichtet, dass die Server-Komponente zufriedenstellend aus der IDE läuft. Nun möchte ich mit Hilfe von Maven2 meine Builds für die Test- und Produktiv-Umgebung machen. Das kann ich derzeit über die Resourcen steuern. Ich habe unterschiedliche Properties Dateien für Test und Prod, die derzeit über Spring in die XML-Konfiguration integriert wird (Property-Placeholder-Configurer per ${...} Notation). Zusätzlich möchte ich dann je nach Test oder Prod eine andere log4j Konfiguration deployen.

Wie mache ich sowas nun am besten mit Maven? Ich habe im Guide gelesen, dass Maven dazu in der Lage ist, ähnlich wie Spring die Properties per ${...} Notation zu ersetzen. Dafür verwendet man folgendes in der POM:


```
<build>
<filters>
<filter>src/main/filters/default.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
```

Und weiterhin habe ich gelesen, dass man sich unterschiedliche Profile anlegen kann. Gehe ich nun recht in der Annahme, dass ich mein Vorhaben bewerkstelligen kann, indem ich mir für Test und Prod jeweils ein Profil anlege und dann per Filter dort die Properties ersetze, jeweils mit einer anderen Property Datei?

Oder wie macht ihr sowas?

Grüße byto


Edit: Thread bitte nach Deployment verschieben.


----------



## maki (13. Jul 2009)

*verschoben*

Für so etwas sollte man imho am besten Profile verwenden, in denen dann die Properties definiert sind (standard Maven2 Syntax).
Es gibt zwar einen "dreckigen" Hack das alles auch per Property Dateien zu lösen, führt ime aber zu mehr XML Konfiguration, ist verwirrend auf Dauer und ist nicht  Standardkonform.


----------



## byte (13. Jul 2009)

Hast Du einen noch einen Tipp für mich, wie ich am besten je nach Build unterschiedliche log4j Konfigurationen integrieren kann?


----------



## byte (14. Jul 2009)

OK, ich habs nun gelöst und es funktioniert sehr gut. Die Properties werden beim Maven Build automatisch in die Spring Konfigs integriert. Das habe ich über verschiedene Profile und Property Dateien gelöst (letztere gabs eh schon, so musste wenig geändert werden).

Über den gleichen Mechanismus setze ich auch je nach Environment eine andere log4j Config über folgende Spring Bean:


```
<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
		<property name="targetMethod" value="initLogging" />
		<property name="arguments">
			<list>
				<value>classpath:${log4j.configuration}</value>
			</list>
		</property>
	</bean>
```

Der Wert für ${log4j.configuration} kommt dann wieder aus der jeweiligen Property Datei.

Bin jetzt übrigens auch dazu übergegangen, den Test-Tomcat per Maven zu starten (und nicht mehr mit WTP). Das geht ja sehr komfortabel per tomcat:run Goal, und Debugging klappt da netterweise auch per m2.


----------



## maki (14. Jul 2009)

Habe immer das ant run plugin genutzt um unterschiedliche Dateien im Build zu integrieren, eine elegante Lösung kenne ich nicht..
Gute Idee mit Spring Config, werde ich mir mal genauer ansehen.

Habe nicht soviel Erfahrung mit m2eclipse und WTP, nutze das Sysdeo Plugin weil nur das den Tomcat 3.3 unterstützt (Legacy, *würg*).

Im Prinzip wäre das Ideal wenn man die Eclipse Tools genauso weiternutzen könnte, selbst wenn es sich um ein Maven2 Projekt handelt, für viele ist das schon der Fall imho.


----------



## byte (14. Jul 2009)

maki hat gesagt.:


> Habe nicht soviel Erfahrung mit m2eclipse und WTP, nutze das Sysdeo Plugin weil nur das den Tomcat 3.3 unterstützt (Legacy, *würg*).


Ich benutze jetzt das Tomcat Plugin, das startet einen embedded Tomcat 6. Haben zwar produktiv einen 5.5er, aber was solls. Nutzen eh keine Tomcat Features, von daher sollte es wurscht sein. Und Integrationstests gibts dann eh auf ner Testinstanz im Rechenzentrum. 



> Im Prinzip wäre das Ideal wenn man die Eclipse Tools genauso weiternutzen könnte, selbst wenn es sich um ein Maven2 Projekt handelt, für viele ist das schon der Fall imho.



Das kriegt man auch tatsächlich hin. Ist ganz gut in dem Tutorial beschrieben, das ich hier irgendwo gepostet habe. Der "Trick" ist halt, das Projekt als Dynamic Web Project in Eclipse WTP zu erstellen und dann Maven per m2 hinzuzufügen. Danach muss man noch ein paar Einstellungen in der .classpath und in einer anderen Settings Datei von WTP machen.

Aber im Grunde find ichs jetzt doch einfacher, wenn man einfach per tomcat:run testet.


----------



## maki (14. Jul 2009)

> Das kriegt man auch tatsächlich hin. Ist ganz gut in dem Tutorial beschrieben, das ich hier irgendwo gepostet habe. Der "Trick" ist halt, das Projekt als Dynamic Web Project in Eclipse WTP zu erstellen und dann Maven per m2 hinzuzufügen. Danach muss man noch ein paar Einstellungen in der .classpath und in einer anderen Settings Datei von WTP machen.


Hmm... nix dagegen das du den Tomcat lieber über maven startest, aber eigentlich das Plugin automatisch die Eclipse Projektdateien aktualisieren.

Hab gerade mal getestet, ein neues Webprojekt (unter Eclipse Maven Archtype generiert), WTP Server konfiguriert, Projekt angegeben und fertig, läuft wie mit ohne Maven.

Hast du die WTP Integration für m2eclipse mitinstalliert?
Hält sich das Projekt an die Maven konventionen?
Hilft das hier: Rechtsklick auf Projekt -> Maven -> update project configuration

Ich nutze Eclipse 3.5 mit aktuellem m2eclipse plugin.


----------



## byte (15. Jul 2009)

Hab es auf diese Weise um ehrlich zu sein gar nicht ausprobiert. Ich habe einfach unser bestehendes Webprojekt benutzt und dort Maven hinzugefügt. Die Konventionen stimmen auch (src/main/java, src/main/resources, src/main/webapp, src/test/java, src/test/resources).
Aber gut zu wissen, dass man das Projekt auch direkt mit Maven erstellen kann. Das spart zukünftig einiges an manueller Arbeit.


----------



## maki (15. Jul 2009)

Ja, erstellen kann man es auch mit Maven, worauf ich hinauswollte war das man mittlerweile eigentlich die .classpath und .project Dateien gar nicht mehr selbst ändern muss, da dies das plugin übernehmen sollte.
In früheren Version von m2eclipse war die Integration nicht so sauber und es musste öfters manuell nachbearbeitet werden.


----------



## byte (15. Jul 2009)

maki hat gesagt.:


> Rechtsklick auf Projekt -> Maven -> update project configuration



Habe ich jetzt mal getestet und funktioniert im Grunde auch, allerdings fehlt dann eine wichtige Einstellung, nämlich das Auflösen der Maven Dependencies. Man kann das aber einfach einstellen über Project -> Properties -> Java EE Module Dependencies -> Haken bei Maven Dependencies machen


----------



## maki (15. Jul 2009)

Verwundert mich etwass, normalerweise sollten die Maven2 Dependecies automatisch zum Build Path hinzugefügt werden.
Hat das etwas mit dem TestNG Thread von dir kürzlich zu tun?


----------



## byte (15. Jul 2009)

Keine Ahnung worans liegt, ist mir im Grunde aber auch egal, denn es funktioniert ja. Und notfalls kann man alles per Hand anpassen in der 
	
	
	
	





```
.classpath
```
 und 
	
	
	
	





```
.settings/org.eclipse.wst.common.component
```


----------

