Maven 2 ist nun schon seit einiger Zeit auf dem Markt. Diese Woche habe ich beschlossen, ein Projekt, an dem wir arbeiten, auf Maven 2 zu migrieren. Hier ist ein Teil der Probleme, auf die ich bei der Migration zu Maven 2 gestoßen bin:
Die project.xml in Maven 1.x wird umbenannt und heißt in Maven 2 pom.xml. Die project.xml unseres Projekts sah in etwa so aus:
Es scheint, dass das Surfire-Plugin versucht, meine Utility-Klasse als TestCase auszuführen, da eines der Muster in der Include-Liste standardmäßig lautet: **/Test*.java. Doh! In maven 1.x konnten Sie Ihre Excludes im unitTest-Tag definieren. Jetzt müssen Sie Ihre Test-Excludes in der Deklaration des Surfire-Plugins definieren, das meine Tests ausführt, was mir logisch erscheint.
So fügen Sie Klassen zur Exclude-Liste hinzu:
Um diesen Teil der Migration zusammenzufassen, muss ich sagen, dass mir die Funktion Transitive Dependency, die die pom.xml in Bezug auf die project.xml aufräumt, sehr gut gefällt. Eine weitere gute Sache ist, dass fast alle Abhängigkeiten auf der https://www.ibiblio.org/maven2/ zu finden sind, so dass man nicht nach anderen Repository-Speicherorten googeln muss.
Es gibt auch zwei Dinge, die mir generell aufgefallen sind, die mir nicht gefallen haben:
Krug
Plugin
src/java
test/java
maven-javadoc-plugin
Wenn ich die project.xml (https://maven.apache.org/maven-1.x/reference/project-descriptor.html) mit der pom.xml (https://maven.apache.org/maven-model/maven.html) vergleiche, fällt mir sofort der enorme Unterschied in der Größe auf. Die Definition der pom.xml ist etwa 4 Mal so groß wie die der project.xml.... Ich kann mich des Eindrucks nicht erwehren, dass das nicht gut sein kann, warum ist sie so groß?
Ich beschließe, mit den Abhängigkeiten zu beginnen. Die neue coole Funktion in Maven 2 ist Transitive Dependencies (https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html). Nehmen wir an, Sie verwenden Hibernate in Ihrem Projekt. Mit maven 1.x mussten Sie alle Jars, von denen Hibernate abhängt, in Ihrer project.xml definieren. Mit maven 2 ist dies nicht mehr notwendig, da maven 2 diese Abhängigkeiten für Sie auflöst. Dadurch wird die pom.xml im Vergleich zur project.xml aufgeräumt. Die Abhängigkeiten werden genauso deklariert, wie Sie es in der project.xml tun würden:
org.hibernate Winterschlaf 3.1.1 KrugFast alle Abhängigkeiten können von https://www.ibiblio.org/maven2/ heruntergeladen werden. Dies ist auch das Standard-Repository, das in maven 2 verwendet wird. Achten Sie auf die groupId's, bei einigen Töpfen wurden kleinere Änderungen vorgenommen und sie befinden sich an anderer Stelle. Zum Beispiel lautet die groupId von Hibernate jetzt org.hibernate statt hibernate. In maven 1.x konnten Sie Ihre eigenen Repository-Speicherorte in den project.properties hinzufügen. Ab maven 2 gibt es project.properties nicht mehr, und Sie müssen Ihre eigenen Repository-Speicherorte in der pom.xml angeben:
jibx.sf.net JiBX Repository https://jibx.sf.net/maven2Auch wenn Sie Ihr lokales Repository nicht in {user.home}/.m2/repository platzieren möchten, müssen Sie eine settings.xml erstellen und diese in {user.home}/.m2 platzieren. Eine vollständige Beschreibung der Datei settings.xml finden Sie unter https://maven.apache.org/maven-settings/settings.html.
e:/documents/data/maven2-repoEs dauert eine Weile, alle Abhängigkeiten zu migrieren. Die meiste Zeit verbringe ich damit, herauszufinden, wo die Jars zu finden sind, aber schließlich habe ich alle Abhängigkeiten gefunden (mit Ausnahme der easymockclassextension-1.2.jar, die ich lokal installiert habe). In maven 1.x haben Sie die Plugins auch als Abhängigkeiten definiert, in maven 2 befinden sich die Plugins auf verschiedenen Ebenen der pom.xml. Wir haben Plugins, die für die Build-Zeit benötigt werden, wie das maven-jibx-plugin, und Plugins, die für die Berichterstattung verwendet werden, wie das maven-pmd-plugin. Das maven-jibx-Plugin ist im build-Tag definiert:
org.jibx
maven-jibx-plugin
1.1
binden
Die pmd-Plugin-Definition wird in das Reporting-Tag integriert:
org.apache.maven.plugins
maven-pmd-plugin
Die pom.xml sieht jetzt ungefähr so aus:
src/java
test/java
Ziel/Klassen
Ziel/Test-Klassen
false
Ziel
Der Lesbarkeit halber habe ich alle Namen der Abhängigkeiten weggelassen. Gesamtzeilen in pom.xml: 285, Gesamtzeilen in project.xml: 491. Wow, obwohl die pom.xml auf den ersten Blick wie ein riesiges Ding aussah, hat sie meine pom.xml tatsächlich schrumpfen lassen. Punktestand: 1-0 für Maven 2 mit den Transitiven Abhängigkeiten!
Nachdem ich nun also alle Abhängigkeiten und Plugins migriert habe, ist es an der Zeit, die neue pom.xml zu testen und den Quellcode zu kompilieren. Der neue Name der Maven-"ausführbaren" Datei lautet jetzt mvn. Ich führe mvn compile aus und alles kompiliert, das ist zu schön, um wahr zu sein!
Als nächstes müssen wir das Projekt testen, also führen wir mvn test aus. Ah, endlich geht etwas schief ;-)... Ich erhalte eine NoSuchMethodException bei einer Utility-Klasse (TestSetupUtils), die ich in meinen Testklassen verwende. Seltsamer Fehler, denn die Klasse, über die er sich beschwert, ist kompiliert und befindet sich im testOutputDirectory, wie ich es deklariert habe. Was ist dann los?
org.apache.maven.plugins
maven-surefire-plugin
**/TestSetupUtils*.java
Nach dieser Ergänzung der pom.xml laufen die Tests und wir sind einen Schritt näher an maven 2.
Ich bin jedoch noch lange nicht fertig. Ich muss noch alle Reporting-Plugins sammeln, die wir jetzt verwenden, und herausfinden, wie wir mit der maven.xml-Datei umgehen. Ab maven 2 gibt es die Datei maven.xml nicht mehr, da jetzt alles ein Plugin sein sollte. Wir haben ziemlich viel Ant-Code in der maven.xml, der größte Teil ist für die Erzeugung einer Distributionsdatei. Außerdem habe ich gerade ein Projekt migriert, das zu einem Multiprojekt-Setup gehört. Das dürfte also eine nette Herausforderung sein.- Die erste Sache ist, dass die Dokumentation besser sein könnte, zum Beispiel hoffte ich, eine klare Migrationsanleitung von maven 1 zu maven 2 zu finden, aber das einzige, was ich auf der maven-Website fand, war dies: https://maven.apache.org/maven1.html#changed, was bei weitem nicht genug ist und ich musste eine Menge möglicher allgemeiner Fragen herausfinden, wie die Ausschlussliste der Tests.
- Die zweite sehr ärgerliche Sache ist, dass die Links auf der Seite mit der Beschreibung der pom.xml, https://maven.apache.org/maven-model/maven.html, in Firefox (1.5.0.1) nicht funktionieren. Stellen Sie sich also darauf ein, dass Sie auf dieser Seite viel scrollen müssen.
Verfasst von
Lars Vonk
Unsere Ideen
Weitere Blogs
Contact
Let’s discuss how we can support your journey.



