# Maven -Organisation-Pom (scm)Management



## dermoritz (11. Okt 2010)

Ich bin gerade dabei eine "Organization pom" ("Firma-Super-Pom") zu basteln. Da habe ich einige Fragen zu:

Wie bindet man die am besten ein - als "parent pom" oder geht es auch irgendwie globaler über die settings.xml (gute Idee?)?

Zu einigen Teilen der pom gibt es ja "management"-tags (z.B. pluginManagement, dependencyManagement..) wofür gibt s das bzw. sind das die tags speziell für "parent"-poms (benötigen selbst kein plugin aber wollen was darüber sagen)?

Was diese management-Tags betrifft: gibt es sowas für Versionskontrolle? Bei uns gibts einen svn-server und damit sehen alle scm Pfade sehr ähnlich aus: svn://firmenSvn/ProjektName\trunk (...tags). Kann man das auch irgendwie global festlegen? Sodass lokal nur noch der "ProjektName" festgelegt wird und vielleicht per Default "<artifactId>" benutzt wird?

Ansonsten hab ich vor diese Firmen-Pom wie ein Projekt mit eigenem SVN und Releasezyklus zu behandeln - ok?

Gibt es noch Tips/Best Practices zur Verwendung von solchen Globalen Poms? Was sollte rein was auf keinen Fall?

Danke im Voraus


----------



## kama (11. Okt 2010)

Hallo,



dermoritz hat gesagt.:


> Wie bindet man die am besten ein - als "parent pom" oder geht es auch irgendwie globaler über die settings.xml (gute Idee?)?


mit Maven 2.X nur als parent möglich mit Maven 3.1 ? (via mixins)...gerade ist Maven 3.0 rausgekommen...



dermoritz hat gesagt.:


> Zu einigen Teilen der pom gibt es ja "management"-tags (z.B. pluginManagement, dependencyManagement..) wofür gibt s das bzw. sind das die tags speziell für "parent"-poms (benötigen selbst kein plugin aber wollen was darüber sagen)?


pluginManagment definiert die Versionen von Plugins damit in den abgeleiteten POM nur noch der Name der Plugins definiert werden muss bzw. darf und somit immer von der Parent-Pom bestimmt welche Version des Plugins verwendung findet. Etwas das gleiche macht dependencyManagement..für dependencies.



dermoritz hat gesagt.:


> Was diese management-Tags betrifft: gibt es sowas für Versionskontrolle? Bei uns gibts einen svn-server und damit sehen alle scm Pfade sehr ähnlich aus: svn://firmenSvn/ProjektName\trunk (...tags). Kann man das auch irgendwie global festlegen? Sodass lokal nur noch der "ProjektName" festgelegt wird und vielleicht per Default "<artifactId>" benutzt wird?


Nein kann man nicht, da diese Pfade beim Release ersetzt werden und somit eine Festlegung in Form einer Property etc. keinen sinn machen...in Multi-Module build macht die definition nur in der Parent POM sinn...



dermoritz hat gesagt.:


> Ansonsten hab ich vor diese Firmen-Pom wie ein Projekt mit eigenem SVN und Releasezyklus zu behandeln - ok?


Ich hoffe nicht in einem eigenen Repository sondern als eigenes Projekt im SVN....genau so ist es auch richtig...



dermoritz hat gesagt.:


> Gibt es noch Tips/Best Practices zur Verwendung von solchen Globalen Poms? Was sollte rein was auf keinen Fall?


Apache Projekt anschauen...da gibt auch einige gute Beispiele....

Gruß
Karl Heinz Marbaise


----------



## dermoritz (12. Okt 2010)

Haha wunderbar, danke Kama.

Ich habe gerade gestern Maven 3 installiert. Das heißt "mixins" sind nicht relevant für mich? 

Was passiert eigentlich wenn jemand lokal eine andere Version verwendet (das version-tag setzt)? Wenn ich es richtig verstanden habe setzt man Versionen für Plugins und Abhängigkeitet per "management-tags". (default)Einstellungen für Erben setzt man in den "normalen" tags, oder?

Zum drüberschauen und kritisieren hier mal meine UrMutter-pom:


```
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>de.orga</groupId>
	<artifactId>orga-pom</artifactId>
	<version>1.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>orga-pom</name>
	<description>Projektübergreifende Maveneinstellungen</description>
	<organization>
		<name>orga</name>
		<url>orga/</url>
	</organization>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven-compiler-plugin.version>2.3.1</maven-compiler-plugin.version>
		<maven-release-plugin.version>2.0</maven-release-plugin.version>
	</properties>
	<scm>
		<connection>scm:svn:svn://svn-serv/orga-pom/trunk</connection>
		<developerConnection>scm:svn:svn://svn-serv/orga-pom/trunk</developerConnection>
		<url>scm:svn:svn://svn-serv/orga-pom/trunk</url>
	</scm>
	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>${maven-compiler-plugin.version}</version>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-release-plugin</artifactId>
					<version>${maven-release-plugin.version}</version>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-release-plugin</artifactId>
				<configuration>
					<tagBase>svn://svn-serv/orga-pom/tags</tagBase>
					<scmCommentPrefix>[sandbox] release:</scmCommentPrefix>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<distributionManagement>
		<repository>
			<id>releases</id>
			<name>nexus releases</name>
			<url>http://nexus/releases/</url>
		</repository>
		<snapshotRepository>
			<uniqueVersion>false</uniqueVersion>
			<id>snapshots</id>
			<name>nexus snapshots</name>
			<url>http://nexus/snapshots/</url>
		</snapshotRepository>
	</distributionManagement>
</project>
```
Wichtig wäre mir hier im Moment nur, das alle Erben utf-8 und Java 1.6 Projekte sind. Hab ich das erreicht?


----------



## kama (12. Okt 2010)

Hallo,



dermoritz hat gesagt.:


> Ich habe gerade gestern Maven 3 installiert. Das heißt "mixins" sind nicht relevant für mich?


Nein. Hatte ja geschrieben Maven 3.1 (vermutlich)...


dermoritz hat gesagt.:


> Wichtig wäre mir hier im Moment nur, das alle Erben utf-8 und Java 1.6 Projekte sind. Hab ich das erreicht?


Leider werden die properties nicht vererbt. Da wäre wahrscheinlich ein Weg über ein entsprechenden archetype zur Erzeugung der default struktur besser....
Die Properties in der POM machen keinen sinn, da die versionsnummern ja nur im pluginManagement bzw. dependencyManagement Abschnitt Verwendung finden.


Das Compiler Plugin würde ich nur in den pluginManagement bereich packen aber nicht in den Build bereich, da sonst jede POM die davon erbt direkt einen Build ausführt...das gibt manchmal etwas komische Effekte...Wichtig ist die Konfiguration für das Compiler Plugin kann trotzdem im pluginManagement Bereich abgelegt werden.

Gruß
Karl Heinz Marbaise


----------



## bygones (12. Okt 2010)

ich würde auch raten als Properties nie sowas [c]xxx.version[/c] zu nehmen. Da gab es afaik auf der Mailingliste nen Thread da das .version zu komischen Fehlern führte


----------



## dermoritz (14. Okt 2010)

die Versionen per Property festzulegen und xxx.version zu nennen hab ich aus irgendeinem google-Fund zu diesem Thema. Also die einzigen Sachen die ich mit der Orga-Pom anstellen will, sind im Moment die Java-Version(1.6), das Encodeing(utf-8), das distribution-management und der ganze Headerkram.

Geht das alles? Wenn ja wie bzw. was muss ich an meiner pom ändern?


----------



## kama (14. Okt 2010)

Hallo,



dermoritz hat gesagt.:


> ...sind im Moment die Java-Version(1.6), das Encodeing(utf-8), das distribution-management und der ganze Headerkram...


Du solltest die Java Version (Compiler) plugin in den pluginManagement Bereich packen und dort auch die Konfiguration für das Plugin angeben...
Das Problem mit dem Encoding ist, dass die Properties nicht vererbt werden...somit wäre es zu überlegen die üblichen Verdächtigen im pluginManagement anzugeben und auch für das Encoding zu konfigurieren...(z.B. resources plugin etc.).

Gruß
Karl Heinz Marbaise


----------



## dermoritz (18. Okt 2010)

Danke,

soo ich habs noch mal geändert:

```
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>...</groupId>
	<artifactId>...</artifactId>
	<version>1.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>...-pom</name>
	<description>Projektübergreifende Maveneinstellungen ...</description>
	<organization>
		...
	</organization>
	<scm>
		<connection>...</connection>
		<developerConnection>...</developerConnection>
		<url>...</url>
	</scm>
	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.3.1</version>
					<configuration>
						<source>1.6</source>
						<target>1.6</target>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-release-plugin</artifactId>
					<version>2.0</version>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-release-plugin</artifactId>
				<configuration>
					<tagBase>.../tagBase>
					<scmCommentPrefix>[sandbox] release:</scmCommentPrefix>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	<distributionManagement>
		<repository>
			<id>releases</id>
			<name>nexus releases</name>
			<url>http://.../releases/</url>
		</repository>
		<snapshotRepository>
			<uniqueVersion>false</uniqueVersion>
			<id>snapshots</id>
			<name>nexus snapshots</name>
			<url>http://.../snapshots/</url>
		</snapshotRepository>
	</distributionManagement>
</project>
```

ist das in meinem Sinne? - falls irgendein anderes Plugin eine encoding Einstellung hat mach ich es analog zum Compliler-Plugin?!
Was sollte eurer Meinung eventuell noch in diese pom?


----------



## dermoritz (26. Okt 2010)

ich hab mal doch noch eine Frage zu den Properties: Falls ich diese in der Mutterpom setze und gleichzeitig verwende (z.b. im Plugin-Management), dann wird ihr Wert zumindest indirekt vererbt, oder?
Also ich würde Encoding und Versionen per Property setzen (dan sieht man de"wichtigen" Werte alle zusammen in der Orga pom) und dann in der Orga-Pom direkt verwenden - bei "encoding" oder "version". So müsste es funktionieren oder?

Falls das funktioniert wie sieht es mit default-Werten aus: In der Orga pom habe ich: "<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>"
 des weiteren habe ich im Plugin-Management einige Plugins, deren Encoding per default auf "${project.build.sourceEncoding}" gesetzt wird - interessiert das irgendwie die Kindprojekte? Also falls das Kindprojekt das Encoding nicht explizit setzt welches Encoding benutzt dann das Kind?

Alternativ würde ich in allen Plugins die "Encoding" benutzen, dies explizit setzen:
<encoding>${project.build.sourceEncoding}</encoding>
das würde dann in der Mutter pom durch die lokale Propertiy ersetzt und die Kinder würden es erben oder?

(Um das mal selbts prüfen zu können: kann ich irendwie effektiv wirksame Einstellungen abfragen?)


----------



## maki (26. Okt 2010)

> das würde dann in der Mutter pom durch die lokale Propertiy ersetzt und die Kinder würden es erben oder?


Ja, musst halt daran denken auch die Parent oder besser "Company Pom" zu bauen & installieren/deployen.

Wobei ich niemals das encoding als Propepty definiteren & vererben würden ,oder kennst du einen Anwendungsfall für den utf-8 nicht geeignet ist? 
Die Javaversion für den Compiler dagegen kann man auchmmal auf 1.5 oder gar 1.4 setzen wenn man es zB. mit legacy Projekten zu tun hat, mit anderen Worten würde es imho Sinn machen eine Company Pom pro verwendeter Javaversion zur Verfügung zu stellen, dann noch eine für WebApps, etc. pp., natürlich alle mit entsprechender Reporting Konfiguration für Unittests & Code Coverage, Repo aktivität (zB. mit svnstat) Code MEtriken (FindBugs, CPD, usw.).

Company Poms erstellen ist nicht trivial 

Kannst ja bei maven-calm - Project Hosting on Google Code abschauen.


----------



## dermoritz (8. Nov 2010)

Danke,

das die Company-pom irgendwann mehr kann als mein erster Versuch ist das erklärte Ziel. Im Moment soll nur der allerkleinste gemeinsame Nenner gefunden werden: Java 1.6 und UTF-8. (Legacy-Projekt sollen nicht nach Maven megriert werden).


Was meinst du damit ",oder kennst du einen Anwendungsfall für den utf-8 nicht geeignet ist?" - heißt das, dass utf-8 der Standard ist? Also wenn man utf-8 wünscht man gar nix machen muss?

Und danke für den Maven-Calm-Tip


----------



## maki (8. Nov 2010)

SVN unterstützt utf-8 per default,, damit gibt es keine Probleme, Eclipse nimmt unter Linux utf-8 und unter Windows per default ein Windowsspezifisches welches mir gerade nicht mehr einfällt (arbeite nur noch mit utf-8  ), wenn das Kompilerplugin richtig konfiguriert ist, sollte das m2eclipse Plugin die Einstellungen auch übernehmen (konkret utf-8 für Eclipse unter Windows etc.).
Kurz: utf-8 für alles und gut ist, kein Bedarf für ein anderes Encoding.


----------



## dermoritz (9. Nov 2010)

das mit windows ist ja mein Problem: unter Windows wird nicht UTF-8 genommen. Ich will aber immer UTF-8. In Eclipse hab ich das schon workbenchweit eingestellt. Aber mein Verdacht war eben, dass Maven genau wie Eclipse das System-Encoding als default nimmt und das will ich unterbinden.


----------



## kama (9. Nov 2010)

Hallo,

das liegt nicht an Maven sondern an Java...java nimmt wenn kein encoding gesetzt den Plattform default an....bei Windows eben...

Kann nur über die Einstellung in Windows geändert werden oder eben seitens Vorgaben..

Gruß
Karl Heinz Marbaise


----------

