Freitag, 24. April 2009

Maven Buch

Auf den Seiten der Firma Sonatype gibt es ein frei zugängliches (Creative Commons) Buch zum Thema Maven. Hier der Link zur deutschen Version des Buches. Alternativ kann man sich nach einer Registrierung  hier die PDF-Version des Buches herunterladen. 

Donnerstag, 23. April 2009

Maven Philosophie

Man kann Maven am besten vor dem Hintergrund von anderen Build-Werkzeugen wie Ant oder Make verstehen. Ich habe jahrelang alle meine Projekte mit Ant gemanaget. Dadurch ergab sich eine gewisse Standardisierung der Projekte. Ich verwendete immer die selbe bewährt Dateistruktur, immer die selbe Abfolge von Ant-Tasks. In der Regel kopierte ich dann auch die Ant-Build-Datei und passte sie leicht an. Alle Variablen waren richtig gesetzt. Es kam so zu einer Automatisierung der Softwareentwicklung. An dieser Stelle die Maven-Idee an. Maven geht jetzt noch einen Schritt weiter indem Maven davon ausgeht, dass es ein solches Vorgehen bei vielen Softwareentwicklern gibt und automatisiert den Build-Prozess. Dies geschieht auf folgenden Wegen:
  • Einführung eines Standard-Lifecycles für den Build-Prozess
  • Standard-Dateistruktur fürs Projekt
  • Jar-Management
  • Plugin-Managment
Das Hauptproblem aus meiner Sicht für Ant-Benutzer ist, dass sich der Lifecycle und auch die Standard-Dateistruktur sich nicht in einer normalen pom.xml widerspiegeln. In Ant oder auch in Make werden nur Dinge ausgeführt, die der Entwickler explizit in den entsprechenden Dateien definiert. In Maven greift hier die Automation, viele Dinge passieren ohne weiteres zutun des Entwicklers. Das man erstmal verkraften. Dazu kommt, dass man dadurch das man keine entsprechenden Anweisungen in der Steuerungsdatei definieren musste, fehlt dem Maven-Einsteiger der offensichtliche Ansatzpunkt um nach seinen Vorstellung das Projekt zu manipulieren. Ein weiterer Stolperstein für Maven-Anfänger oder Umsteiger ist, das der hohe Automatisierungsgrad sich nicht 1:1 durch das Maven-Eclipse-Plugin m2eclipse wieder findet. Dies kann z.B. zu interessanten Fehlern wie dem folgenden führen. Ich habe in Eclipse eine Javaklasse angelegt und dann mir durch Eclipse die passende Testklasse erzeugen lassen. Diese legt Eclipse automatisch im selben Package und im selben Verzeichnis ab. Das führt zu einem Fehler im Maven-Build-Prozess, weil die Testdateien nicht im selben Verzeichnis wie die Klasse liegen dürfen. Ih habe ein bisschen nach diesem Fehler suchen müssen, weil der Code korrekt war, die Dateien sich alle im Build-Path befanden und die Fehlermeldungen nicht auf das eigentliche Problem hinwiesen. In Nicht-Maven-Projekten existiert tritt dieser Fehler nicht auf.

Dienstag, 21. April 2009

Texlipse

Zur Zeit erstelle ich ein Liste meiner Programmierwerkzeuge. Heute ist der Abschnitt zu Texlipse fertig geworden. Teclipse ist ein Eclipse-Plugin zur Erstellung von Latex-Dokumenten. Weiters ist hier zu finden: http://sites.google.com/site/mirkoebert/Home/werkzeuge

Dienstag, 14. April 2009

Mehrere Ant-Schnipsel in Maven

Es ist natürlich möglich mehrere Ant-Schnipsel in Maven zu benutzen. Dazu fügt man dem Ant-Plugin mehrere execution in den executions Tag ein. Wichtig hierbei ist die Verwendung des Id-Tags.

<executions>
<execution>
<id>id1</id>

...

Leider kann man für das Id-Tag keine einfache Schreibweise verwenden wie z.B.:

<executions>
<execution id="id1" >
...

Das wäre aus meiner Sicht übersichtlicher und platzsparender. Aber es geht nicht.

Interactive Maven

In Ant ist es möglich zur Ausführungszeit via input Variablenwerte durch den Benutzer setzen zu lassen.

<input message="Please enter project name:"
addproperty="project"
defaultvalue="ewindtech"
/>


Wenn ich jetzt versuche diesen Ant-Schnipsel in Maven zu integrieren schlägt dies leider fehl. Auf diese Weise kann Maven nicht interakiv gestaltet werden. Schade.

Donnerstag, 9. April 2009

Neue Maven Version

Seit dem 21.3.2009 ist die Maven Version 2.1.0 verfügbar. Dabei handelt es sich primär um eine Bug-Fix-Version. Aus Performancesicht ist die parallele Auflösung von Artefakten hinzugekommen. Dies sollte in der Regel die Performance steigern. Die komplette Liste ist unter http://maven.apache.org/release-notes.html zu finden.

Mittwoch, 8. April 2009

Integration von Ant in Maven

Oft ensteht der Eindruck, dass man sich für ein Build-Werkzeug entscheiden müsste. Dies ist falsch. Richtig ist, dass sich Ant auch in Maven integrieren lässt und es dafür schon passendes Plugin gibt.

<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Hello World</echo>
<buildnumber file="src/main/webapp/WEB-INF/build.number"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>

Ant gibt in der Console bei der Ausführung den Satz Hello World aus und edswird die Build-Nummer hochgezählt. Beides sind Ant Core Tasks (siehe Ant Manual).

In der Console sieht das dann wie folgt aus:

...
[INFO] [antrun:run]
[INFO] Executing tasks
[echo] Hello World
[INFO] Executed tasks
...

Zu beachten ist, dass die Ant-Tasks am Ende der mit ihr assoziierten Phase ausgeführt werden.

Interaktivität mit Ant

Ant kann sehr einfach Benutzereingaben während der Ausführung entgegennehmen. Hier das Beispiel:

<input message="Please enter project name:"
addproperty="project"
defaultvalue="ewindtech"
/>

Bei der Ausfürung geht eine Dialogbox auf in der der Benutzer einen Test eingeben kann, dieser wird dann der Variable projekt zugewiesen. Diese Variable wird durch diesen Ausdruck gleichzeitig erzeugt. Der Default-Wert der Variable ist in diesem Beispiel ewindtech. Mit message wird der Text der Dialogbox vorgegeben.

Dienstag, 7. April 2009

Variablen

Variablen sind sowohl in Ant als auch Maven ein nützliche Sache. In Maven werden sie folgt definiert:

<properties>
<compileSource>1.5</compileSource>
</properties>

Hier wir eine Variable namens compileSource definiert und mit dem Wert 1.5 versehen. Diese kann denn z.B. im Compiler-Plugin eingesetzt werden:

<source>${compileSource}</source>

In Ant sieht das ähnlich aus:

<property name="classes" value="WebContent/WEB-INF/classes" />

Hier wurde eine Variable mit dem Namen classes erstellt und ihr der Wert WebContent/WEB-INF/classes zugewiesen. Benutzt werden kann dann die Variable wie folgt:

<target name="prepare" depends="">
<mkdir dir="${classes}"/>
</target>

Montag, 6. April 2009

Maven Compiler Plugin konfigurieren

Leider wird der Java-Compiler von Maven per default sehr konservativ mit Parametern beschickt. So das es fast immer notwendig ist die Einstellungen anzupassen. Dies passt aus meiner Sicht eigentlich nicht zur Maven-Philosophie.
So muss man die Sprachversion und Encoding des Quelltextes und die Zielsprachversion in fast allen Fällen explizit angeben. Hier ein Beispiel:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
   <source>1.6</source>
   <target>1.6</target>
   <encoding>UTF-8</encoding>
</configuration>
</plugin>
Wichtig ist die korrekte Schreibung der XML-Tags, so sind die i der Ids gross geschrieben.

Maven 2

Wer mit Maven arbeitet, kommt nicht umhin Jar's zu ins eigenen Projekt zu integrieren, die nicht im zentralen Repository zu finden sind. Um solche fremden Pakete (Jar's) in eigene Repository (/Users/ebert/.m2) zu integrieren benötigt man nicht eine eigene Maven-Installation. Klassischer Wiese braucht man eine Maven-Installation und führt dann in der Shell folgenden Befehl aus: mvn install:install-file -DgroupId=java.plugin -DartifactId=plugin -Dversion=jre-1.5 -Dpackaging=jar -Dfile=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home/lib/plugin.jar -- jetzt ist das betreffende Jar registriert.
Wenn man mit Eclipse arbeitet kann man das auch ohne zweite Maven-Installation machen. Eclipse bringt Maven schon mit. So kann man z.B: install:install-file -DgroupId=java.plugin -DartifactId=plugin -Dversion=jre-1.5 -Dpackaging=jar -Dfile=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home/lib/plugin.jar direkt im Run-Dialog unter Goals von Maven eingeben. Dieser Dialog ist eigentlich nicht für diese Verwendung gedacht, funktioniert aber.

Freitag, 3. April 2009

Ant vs. Maven

Die Frage nach den richtigen Build-Tool. Ja gibt es da überhaupt? Ich habe jetzt über viele Jahre mit Ant gearbeitet und damit auch komplexe Projekte gebaut. Einige Highlights: Integration von C++, Deployment zu verschiednen Tomcat-Instancen, automatische Adaptation an Kunden und parallele Ausführung von Build-Teilen. Ich habe ein gutes Verständinis von dem was Ant kann und wie Ant funkioniert. Etwas was immer wiederkehrte war, das ich zwischen den verschiednen build.xml Dateien Code hin und her kopierte und das ich gleichzeitig begann die Projektstruktur und den Build-Prozess zu vereinheitlichen. Dann kam Maven. Die ersten frühen Versuche schlugen fehl. Die Gründe dafür waren die andere Philosophie von Maven (Convention over Configuration), die Intrasparenz was wann passiert und die Integration in Eclipse erschien mir nich so hilfreich. Ich blieb erst mal bei Ant.
Das nächste Erlebnis war auch nicht viel Besser, trotzdem versuchte ich es noch ein mal. Ich migrierte ein größeres Projekt von Ant zu Maven. Ja es funktionierte. Dafür benutzte ich das Eclipse-Plugin m2eclipse. Alles gut? Ja, aber ich hätte da noch ein paar kleine Wünsche:
  • Einfachere Integration fremder Jar's in das Projekt
  • Einfache Übernahme der Maven-Konfiguration zwischen verschiedenen Rechnern
  • Bessere, einfachere Suche nach Jar's (Dependencies)
  • Automatische Mirror-Konfiguration
  • Verbinden der Konsolenausgaben (Fehler) mit Eclipse
  • Automatisches Deployment von War's via Tomcat Manager
Mein Fazit, ich werde weiter auf Maven setzen und spezielle Dinge (Projekt-Adaptation) mit Ant erledigen.

Hier noch eine kleine Ant-Referenz: