Maven at its Best

| | Comments (0)
Maven enthält ja viele Probleme und Ungereimtheiten. Ein Highlight ist aber sicherlich das SCM-Plugin.

Falls einem eine pom jemals zu kurz vorkommt, sollte man dringend das SCM-Plugin darin konfigurieren. Etwa so (aus http://maven.apache.org/scm/plugins/usage.html)

[...]
  <packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SCM Sample Project</name>
<url>http://somecompany.com</url>
<scm>
<connection>scm:svn:http://somerepository.com/svn_repo/trunk</connection>
<developerConnection>scm:svn:https://somerepository.com/svn_repo/trunk</developerConnection>
<url>http://somerepository.com/view.cvs</url>
</scm>
[...]

Das beschert einem einige tolle neue Features:

1. svn -> mvn svn
Nie wieder svn schreiben. Statt

svn update
kann man nun

mvn scm:update
schreiben. Nicht überzeugt?

Es geht noch weiter:

2. Bootstrapping
Stellen sie sich vor ein neues Teammitglied kommt ins Projekt. Früher hätten sie ihm die Url zum svn gemailt (z.B. "http://somerepository.com/svn_repo/trunk"). Dank Maven ist das nun noch einfacher: Geben sie ihm einfach die pom (Zum Beispiel in dem Sie sie auschecken, oder den Link "http://somerepository.com/svn_repo/trunk/pom.xml" weitergeben). Nun kann das neue Mitglied mit

mvn scm:bootstrap
das gesamte Projekt auschecken. Er findet es dann ganze einfach im Unterverzeichnis target.

Damit das neue Teammitglied sein Benutzernamen und Passwort nicht vergisst, ist es gute Praxis sie ins pom zu schreiben. (Aus http://maven.apache.org/scm/plugins/examples/bootstrapping-with-pom.html)

[...]
<build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-scm-plugin</artifactId>
        <version>1.0</version>
        <configuration>
          <username>username</username>
          <password>password</password>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
[...]

Das hat auch einen tollen Nebeneffekt: Der oder die Neue hat soeben seine erste Änderung am Projekt vorgenommen, es lohnt sich also zu committen. Das war ein schnelles Erfolgserlebnis.

Immernoch Zweifel?

3. DRY - Den Chef überzeugen

Mit diesem Feature holen Sie schließlich auch die Projektleitung ins Boot: Maven-SCM folgt dem DRY Prinzip. DRY steht bekanntlich für "Do repeat yourself".

Ihr pom befindet sich als Teil ihres Projektes vermutlich im svn und auf ihrem Rechner in einer Arbeitskopie. mit svn info im Verzeichnis in dem das pom liegt erhalten sie eine Ausgabe wie:

Path: .
URL: http://somerepository.com/svn_repo/trunk
Repository Root:  http://somerepository.com/svn_repo
...

Wie sie sehen kennt das svn die Informationen die in die pom kodiert werden nicht nur, sondern ist sogar bereit sie Ihnen mitzuteilen. Das manuelle Eintragen ins pom führt also zu einer Doppelung der Information. Sie sind nun quasi zweimal so klug wie vorher.

Um alle Vorteile der Anwendung des DRY Prinzips zu genießen, fehlt aber noch ein kleiner Kniff: Sorgen sie dafür das die Informationen auseinander laufen. Zum Beispiel mit:

svn copy  http://somerepository.com/svn_repo/trunk 
http://somerepository.com/svn_repo/branches/featureOne
svn switch http://somerepository.com/svn_repo/branches/featureOne

(Pardon, der Profi verwendet natürlich: mvn scm:branch... Für Switch müssen sie leider noch svn bemühen: Issue SCM-328)

Wenn sie nun ein svn info ausführen, erhalten sie als Url http://somerepository.com/svn_repo/branches/featureOne, während im pom weiterhin die Url des Trunks steht. So schnell habe sie noch nie neue Wahrheiten geschaffen.

Einige Projektleiter sind echte Spielverderber und möchten widersprüchliche Informationen möglichst verhindern. Nun könnten Sie natürlich einfach auf die Angabe der svn Url im pom verzichten, doch dann wären Sie kein echter Maven Benutzer.

Gehen Sie den "Maven Way".

Verwenden Sie ein Plugin als Workaround für die Probleme eines anderen Plugins.

Ins unserem Fall kommt das Maven Release Plugin zu ihrer Rettung: http://maven.apache.org/plugins/maven-release-plugin/branch-mojo.html

mvn release:branch -DbranchName=featureOne
erzeugt nicht nur einfach einen Branch sonder korrigiert dabei auch gleich die urls im pom.

Einleuchtend, oder?