News

Dienstag, 5. Januar 2010 | News

"Maven - eine Ausgeburt der Hölle"

(Link zum Artikel: http://www.it-republik.de/jaxenter/news/053182)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Das beste Buildtool ist dasjenige, das du dir selbst baust. So beginnt Kent R. Spillner seinen polemischen Blogeintrag "Java Build Tools: Ant vs. Maven", in dem er verschiedene Java-Build-Tools miteinander vergleicht.

Der Build-Prozess eines jeden Projektes sei dabei unterschiedlich, und Entwickler von Buildtools könnten unmöglich alle Anforderungen an einen individuellen Build-Prozess antizipieren. Im besten Falle könne ein Tool eine flexible Bibliothek wiederverwendbarer Tasks bereitstellen, die sich den eigenen Bedürfnissen anpassen lassen.

Wer sich vor der Arbeit, ein eigenes Plug-in für seinen Build-Prozesse zu schreiben, scheut, sollte sich Spillner zufolge einmal Rake anschauen, das Buildtool auf Basis von Ruby. Wem die Arbeit mit Rake nicht vergönnt sei, stehe noch vor der Alternative Ant als zweitbestes Java-Buildtool - damit sei der Vorrat an Lösungen vernünftiger Buildtools allerdings schon ausgeschöpft. Auf keinen Fall in Betracht ziehen sollte man laut Spillner den Einsatz von Maven:

So, write your own build tool, or else switch to Rake, or fight to switch to Rake, or quit and go some place where you can use Rake. And if all else fails, use Ant until you can find a new job somewhere else that uses Rake. Kent R. Spillner

That’s it! Those are the only choices I can recommend! Because you never, ever, under any circumstances want to use Maven! Kent R. Spillner

Maven-Builds endeten Spillner zufolge immer in einem "unendlichen Zyklus von Verzweiflung" und führten direkt in die "tiefsten Gefilde der Hölle".

Maven builds are an infinite cycle of despair that will slowly drag you into the deepest, darkest pits of hell (where Maven itself was forged). Kent R. Spillner

Aber ernsthaft: Maven sei eine schreckliche Ansammlung schlechter Ideen. Spillners Kritikpunkte:

  • Die grundlegende pom.xml-Datei von Maven werde sich nur allzu schnell als unzureichend erweisen, und eine adäquate Anpassung sei ein schwieriges, nervenaufreibendes Unterfangen.
  • Die Konfiguration von Maven sei alles andere als konsistent und benötige "The Maven Way" - der allerdings nirgends hinreichend dokumentiert sei.
  • Das Dependency Management System von Maven sei völlig korrupt.

Deshalb Spillners Fazit:

  • Maven is broken and wrong if it assumes humans never make mistakes.
  • Maven is broken and wrong if it requires users to explicitly specify every version of every dependency, and every dependency’s dependencies, to reduce the likelihood of downloading incompatible artifacts.
  • Maven is broken and wrong if it requires a third-party tool to prevent it connecting to the big, bad internets and automatically downloading random crap.
  • Maven is broken and wrong if it thinks nothing of slowing down every build by connecting to the network and checking every dependency for any updates, and automatically downloading them.
  • Maven is broken and wrong if it behaves differently on my laptop at the office and at home.
  • Maven is broken and wrong if it requires an internet connection to delete a directory.
  • Maven is broken and wrong.
Kent R. Spillner

(hs)

Anzeige

Kommentare

Gravatar RPR 05.01.2010
um 12:26 Uhr
Was für ein lustiger Beitrag :-)
Und er artikuliert meine Erfahrungen mit Maven; man ist ja inzwischen leider oft gezwungen, das Teil einzusetzen.
Am aller schlimmsten ist es, wenn man ein open-source-project mit Maven erzeugen muss, weil die Entwickler dessen glauben, keine fertigen builds mehr zur Verfügung stellen zu müssen (oder einen so zwangs-missionieren wollen?):
- Zuerst lädt das sch... Tool das gefühlte halbe Internet in den letzten 200 Versionen aus grundsätzlichen Erwägungen mal runtern.
- Dann lädt der pom-build den Rest runter herunter mit immer neuen Abhängigkeiten - die Geduld wackelt langsam.
- Nach 1/2 h bricht der build und erklärt, dass irgendeine Dependeny doch nicht aufgelöst werden kann und das wars.
Keine Binaries, kein Projekt, nur das halbe Internet auf Platte (säubern tut sich das sch-Teil auch nie).

Aber immerhin hat Maven IMHO zwei Sachen ins Leben gerufen:
1. Die Einsicht, dass es so was wie ein Dependency Management in größeren komplexeren Projekten braucht.
2. Die Einsicht, dass es das Leben einfacher machen kann, wenn Projekte irgendwie standardmäßig aufgebaut sind.

Zum 1. Punkt: Warum man so was _in_ ein build-tool fix reinbauen muss, ist mir aber nach wie vor ein Rätsel... und warum die Abhängigkeiten unbedingt (aufwändig zu ändern) im Internet ohne Zertifikate etc. aufgelöst werden müssen ebenso. Hier ist Ivy genauso bescheuert unterwegs.

Zum 2. Punkt muss man wiederum sagen, dass sie auch vor oder ohne Maven schon meist gut genug strukturiert waren und dass man sich oft wünscht, 90 % der leeren oder nur einen Eintrag enthaltenen Zwangs-Ordner von Maven nicht da wären. (Kann man konfigurieren, aber mit welchem Aufwand.)
#zitieren
Gravatar maw 05.01.2010
um 13:52 Uhr
Solch ein plolemischer Blödsinn.
Das sind wir wieder mal im Kindergarten gelandet: "Mein Spielzeug ist aber besser."
Standards haben einen Sinn: Das Gaspedal ist immer rechts.

Ich habe sehr viele neue und alte Projekte mit maven und den verschiedenen plugins gebaut. Und genau dieser Standard ist das entscheidende Argument für maven. Wer vom Standard abweichen will muss sich ernsthaft fragen lassen: "Hast'e nix besseres zu tun?"
#zitieren
Gravatar MK 05.01.2010
um 14:19 Uhr
Gehe mit RPR absolut einig. Standards sind grundsätzlich eine gute Sache. Maven Builds sind aber so komplex, fehleranfällig und langsam dass es ganz bestimmt bessere Lösungsansätze gäbe. Ich habe in vielen Projekten mit Maven und Ant gearbeitet und mit Ant durchweg die besseren Erfahrungen gemacht. Ich kann es mir nicht leisten bei jedem Build einen Kaffee trinken gehen zu müssen. Ich hab besseres zu tun. #zitieren
Gravatar jiai 05.01.2010
um 14:53 Uhr
Spillner und "RPR" haben in weiten Teilen recht - letztens bin ich auch heldinnenhaft gescheitert beim Versuch ein Open-Source-Projekt zu bauen (DWR).

Maven ist eine tolle Geschichte wenn man die default-Einstellungen verwenden kann - sobald man nur beginnt die Position des lokalen Repositorys zu ändern, ist man aber bereits in der Konfigurationshölle (unter Windows oft sinnvoll). Wenn dann irgendwelche Abhängigkeiten nicht aufgelöst werden können wird es auch sehr spaßig.

Etwas was ich ohne einen Repository Manager (Artifactory) nie geschafft habe, ist der Zugriff auf Artifakte im Internet durch einen Proxy mit NTLM-Authentifizierung - so etwas ist peinlich, wenn es entweder nicht funktioniert oder die Konfiguration dafür absolut obskur ist.

Die Anmerkung bezüglich der Dokumentation kann ich aber so nicht stehen lassen, es gibt zwei ziemlich umfassende Dokumentationen frei im Internet, eine davon auch auf Deutsch:
http://www.sonatype.com/products/maven/documentation/book-defguide
http://repo.exist.com/dist/maestro/1.7.0/BetterBuildsWithMaven.pdf
#zitieren
Gravatar HAL 9000 05.01.2010
um 15:10 Uhr
Sicher ist der Blog polemisch, aber das ändert nichts am Wahrheitsgehalt, der hier schon von einigen bestätigt wurde.

Trifft auf SAP übrigens auch zu: Wenn man die Abläufe seiner Firma komplett umstellt, so dass man an den Defaults von SAP nix ändern muss, funktioniert SAP auch ganz famos ^^.
#zitieren
Gravatar Marc Teufel1 05.01.2010
um 20:31 Uhr
Ich kann die Kritik an Maven nicht ganz nachvollziehen. Okay, auch wir haben etwas gebraucht, bis wir unseren Repository-Manager sauber am Laufen und einen Archetype gebaut hatten, der unseren Ansprüchen gerecht wird, aber seit dem läuft bei uns die Entwicklung von Webanwendungen in geordneten Bahnen.

Neben dem Buildprozess überzeugt mich vor allem die Verwaltung der Abhängigkeiten, weil wir es mit Maven endlich geschafft haben das Bibliothekenwirrwarr auf den einzelnen Entwicklungsrechnern sinnvoll in den Griff zu bekommen. Auch wird bei uns nicht das halbe Internet heruntergeladen - das macht der Server, auf dem unser Repository Manger (Archiva) läuft, nein im Ernst, die benötigten Abhängigkeiten wurden einmal ins zentrale Repository heruntergeladen und stehen seit dem jedem Entwicklungsrechner zur Verfügung. Und in unserem Fall war das garnicht so viel, mag aber auch daran liegen, dass wir einfach nicht soviele abhängige Bibliotheken haben.

Aber auch ich muss zugeben, dass sich Maven bei uns auch nicht für jedes Projekt eignete. So bauen wir unsere Eclipse RCP-Projekte beispielsweise ohne Maven, sondern ausschließlich auf Basis von Ant. Auf Biegen und Brechen geht da gar nichts...

Ich denke man muss viel mehr von Fall zu Fall unterscheiden, welches Buildwerkzeug Sinn macht. Nur weil man in einem Projekt mit Maven schlechte Erfahrung gemacht hat, sollte man nicht das ganze Werkzeug (Achtung: Wortspiel!) verteufeln! Das ist doch gerade das Schöne bei all den Tools die uns zur Verfügung stehen, man kann evaluieren und dann das nehmen, was für seinen speziellen Fall das Beste ist.
#zitieren
Gravatar sascha 05.01.2010
um 22:20 Uhr
Klar hat Maven Schwächen. Welches Tool hat das nicht? Und als wir im Unternehmen vor Jahren von Maven 1 auf Maven 2 umgestiegen sind, war das kein Spass. 1 Jahr hat die Vorbereitung gedauert.

Allerdings hat Maven auch einige gravierende Vorteile. Zum einen sind für 99% der Standardfälle die benötigten Plugins vollkommen ausreichen. In einem Setup aus knapp 120 eigenen technischen Projekten (JAR, EAR, WAR und RAR) und weiteren knapp 120 Fremdbibliotheken, hatten wir selten Probleme und nie gravierende. Weniger Probleme, als zuvor mit der Ant Lösung. Mit Maven funktionierten die CI- und Nighly Builds hervorragend und auf Anhieb.

Und ja, Maven kann ein Monster sein, wenn man in die Tiefe gehen muss. Dies muss der normale Entwickler allerdings sogut wie nie. Bei einem arbeitsteiligen System, bei dem sich ein oder zwei Personen um das Konfigurations- und Buildmanagement kümmern, haben die anderen Entwickler den Kopf frei für ihre eigentliche Aufgabe. Nicht jeder Entwickler muss seine eigenen Mojos schreiben - und erst da wird die Dokumentation schlechter; einige zentrale APIs sind kaum bis gar nicht dokumentiert. Aber selbst da habe ich wahrlich schon schlechtere kommerzielle Systeme gesehen. Und meistens existiert schon ein Plugin, welches Probleme löst. Ein Beispiel: der Support wollte, dass in jedem Firmenartefakt die Subversion Revision, Server und Pfad hinterlegt wird. Die Implementierung für alle Projekte hat 30 Minuten gedauert:

1. entsprechendes Plugin suchen (Google ist mein Freund)
2. Einbau in zentralen POM
3. Testen... geht
4. Per Script alle POMs auf neue zentralen POM anpassen
5. Kaffe trinken gehen

Und ja, vielleicht mag es in Ant, Buildr, Rake oder was auch immer auch so schnell gehen. Aber wir haben eben Maven.

Wir haben uns vor einigen Jahren für Maven entschieden, weil es uns in der "agilen" Entwicklung aus der Dependency-Hölle befreite. Naja, zum Teil befreite, denn viel schlimmer als irgend ein Maven Setup ist es bei komplexeren Projekten die unterschiedlichen XML Parser und Apache Commons Projekte auf einen einigermassen stabilen Pfad zu bekommen.

Viele Entwickler schrecken bei Maven vor der scheinbaren Magie zurück. Das kann ich teilweise verstehen. Entwickler wollen immer die Kontrolle behalten. Programmieren aber trotzdem in Java und nicht in Assembler :-) Prinzipiel haben sie in Maven die volle Kontrolle, sie müssen nur die vereinfachende Schnittstelle durchbrechen.
#zitieren
Gravatar Trepper 06.01.2010
um 10:36 Uhr
Maven ist zwar nicht perfekt, aber viel besser, als die selbstgebastelten Horror-Buildsysteme! Wenn man den Build-Vorgang allgemein verbessern will, sollte man Standards dafür definieren, die dann von verschiedenen Werkzeugen umgesetzt werden können. #zitieren
Gravatar Dierk König 06.01.2010
um 14:34 Uhr
Builds mit Gradle

Ich stimme allen gleichermassen zu! Das Problem ist, man braucht eben beides: Standards _und_ Flexibilität.
Wer die Mächtigkeit von Maven mit der Flexibilität von Ant und der Eleganz von Groovy verbinden möchte, sollte sich mal Gradle anschauen: http://www.gradle.org .
Da kann man auch bestehende Ant oder Maven builds einfach integrieren.
#zitieren
Gravatar netAB 08.01.2010
um 10:28 Uhr
Ich stimme Sascha und Trepper zu. Leider nervt die Implementation von Maven den Entwickler ... ich brauche nicht für jeden Build immer die aktuellsten Versionen von allen Bibliotheken ... ich habe mir angewöhnt mit Option OFFLINE zu arbeiten ... Maven ist eine Konfigurationshölle und gibt leider keine vernünftigen Fehlermeldungen. Dependencies sind eine kritische Sache und die Checks dauern ewig. Toll finde ich das Bibliothekskonzept, jedoch haben wir das mit ANT schnell nachgebaut. Die Eclipseintegration von Maven ist absoluter Schrott, ich hatte in einem Kundenprojekt ständig Compile/Updateprobleme innerhalb von Eclipse. Größtes Manko: ich muss bei Maven als Entwickler dafür sorgen dass ich nicht den Nightlybuild komplett kaputt mache weil ein POM falsch ist ... jedem Entwickler wird die Verantwortung übergeholfen das das Produkt am Ende baut ... so darf das nicht sein und ich habe viele Projekte gehabt, wo es der NightlyBuild-Verantwortliche auch so geschafft hat... den braucht es auch bei Maven. #zitieren
Gravatar DevKnight 09.01.2010
um 00:01 Uhr
Es ist immer wieder amüsant zu beobachten, wie bei jedem Tool/Framework-Vergleich die identischen Argumentationen auf den Tisch kommen. Und man kann diese dann auf einen Nenner zusammenfassen: "Eigentlich wollen wir einen Standard, der vorhandene Quasi-Standard gefällt uns aber nicht so richtig, also machen wir doch was eigenes, und am besten von Grund auf neu".
Dazu kann ich nur sagen: Setzen, sechs. Nichts gelernt im Bereich "wirtschaftlicher effizienter und standardisierter Softwareentwicklung".
Anstatt das Rad jedesmal neu zu erfinden, könnte man doch zur Abwechslung mal gemeinsam an EINER Lösung arbeiten, anstatt zig Nischen-Tools zu bauen, von denen 98% doch wieder in der Versenkung verschwinden. Aber das wäre ja nicht cool (im Team eine tolle Lösung zu entwickeln), man muss ja beim nächsten Stammtischtreffen erzählen können, das man das neue Ultra-All-in-one-Build-Tool ganz alleine programmiert hat (was dann aber letztedlich doch niemand einsetzt).
Anstatt an etablierten Tools/Frameworks rumzumeckern und zu meinen, diese durch ein neues Hobby-Projekt abzulösen, sollte man mal in Erwägung ziehen, ob es nicht effizienter wäre, einfach die Kritikpunkte zu lösen als ständig wieder bei 0 anzufangen... genau das ist nämlich der Gedanke hinter OpenSource-Tools/Frameworks, diese durch gemeinsame Arbeit ständig zu verbessern...
#zitieren
Gravatar RPR 10.01.2010
um 13:48 Uhr
@DevKnight: Ich weiß nicht, was dein Problem hier ist. Wer spricht denn hier von "zig Nischen-Tools"? Die (IMHO) meisten Leute benutzen fast seit einem Jahrzehnt (!) Ant. Manche benutzen Maven und die Ruby-Freaks sinnigerweise eben Rake.
Was hat das mit "das Rad neu erfinden" zu tun? Wer programmiert denn solche "Ultra-All-in-one-Build-Tools", von dem du sprichst? Niemand, genau, setz dich also wieder oder geh wieder schlafen.
#zitieren
Gravatar sascha 18.01.2010
um 18:54 Uhr
Das Problem bei Gradle, Dirk, ist das gleiche wie bei Ant. Es erlaubt zu viele Freiheitsgrade. Anders ausgedrückt: es gibt die die volle Kontrolle. Das führt allerdings in grossen Projekten dazu, dass die Build-Skripte immer mehr mutieren und sie am Ende nur noch einige wenige Entwickler durchschauen. Irgendwann nochmal später, steht dein Projekt auf Sand. Es gilt immer noch der Spruch: Was Entwicklern möglich ist, das nutzen sie auch. Da hilft leider kein Appell and die Vernunft. #zitieren
Gravatar Florian 19.01.2010
um 14:26 Uhr
Einiges an der Kritik ist schon berechtigt. Maven2 POMs sind länger als Ant Files für die selben Projekte, und jedes Plugin funktioniert verschieden.

Der Standard für die Directorystruktur, der defnierte Ablauf des Builds - das ist meines Erachtens eine gute Sache, es gibt eigentlich so gut wie nie einen Grund warum das jedes Projekt anders machen sollte.

Das Depenency Management finde ich aber völlig zuunrecht kritisiert. Es ist die Stärke und nicht die Schwäche von Maven, es funktioniert und es integeriert etwas ins Build was vorher nur manuell gemacht wurde. Wer Angst vom angeblich so bösen Internet hat kann ja eigene Repostories anlegen und nur diese Referenzieren. Verbietet niemand und ist immer noch besser als die Libaries für jedes Projekt herumkopieren zu müssen.

Die ganzen Plugins für Build usw. bringen meines Erachtens aber mehr Nachteile als Vorteile. Man ist viel zu eingeschränkt (im Endprodukt, wo es meist klare Vorstellungen und sogar Vorschriften gibt die man nicht so einfach ändern kann) und alles was man anpassen muss ist extrem mühsam, weil man es nicht aufbaut, sondern automatisch gebautes (das sowieso nie so ist wie man es braucht) abändern muss.

Insgesammt denke ich das ein Ant mit einer standardisierten Diretorystruktur (die aber für Legacyprojekte anpassbar sein sollte) und dem Dependencymanagement für Maven die bessere Lösung gewesen wäre. Maven2 versucht zu viel.
#zitieren
Gravatar jiai 19.01.2010
um 21:33 Uhr
Ant mit dem Dependency-Management von Maven ... das ist dann doch Ivy? http://ant.apache.org/ivy/ #zitieren
Gravatar DevKnight 22.01.2010
um 09:53 Uhr
@RPR: Würdest Du Dich mit den Technologien, die hier angesprochen werden, auskennen, hättest Du meinen Beitrag auch verstehen können. Hast Du Dir bspw. mal Gradle angeschaut? Also wenn hier kein Multi-Purpose-All-in-one-Build-Tool entstehen soll, dann weiß ich auch nicht. Wobei Gradle auch kein Build-Framewok ist, sondern eine Build-Sprache.
Flexibilität ist ja schön und gut, aber bisher hab ich noch kein Problem gehabt, was nicht im Maven-Umfeld lösbar war.
Außerdem geht es um Standardisierung im Build-Prozess. Ich will doch als Consultant nicht in jedem Projekt ein anderes Build-Tool mit anderen Pradigmen/Strukturen haben. Von daher ist der Maven-Ansatz, viele Dinge zu standardisieren und zu vereinheitlichen, zu befürworten, weil Standardisierung am Ende immer Zeit und damit Geld spart.
#zitieren
Gravatar Dierk König 24.01.2010
um 21:37 Uhr
@Sascha: ja, Gradle lässt Dir die ganze Freiheit - und gibt Dir trotzdem einen Standard (apache maven, hört, hört) vor. Das ist ja gerade der Trick! Man folgt dem Standard, wenn er taugt. Dann dann ist "usePlugin 'java'" das ganze Build-Script.
Und wenn ich mehr brauche, kann ich das hinzufügen ohne wieder von Null anfangen zu müssen.
#zitieren
Gravatar Dierk König 24.01.2010
um 21:50 Uhr
@DevKnight: ich stimme Dir zu: Gradle ist "das neue Ultra-All-in-one-Build-Tool". War Maven das nicht auch einmal? Gradle stellt die bestehenden Standards zu Verfügung, gewährt aber trotzdem die notwendige Flexibilität. Und - nein - es ist keine Ein-Mann-Show und - ja - es wird für richtig grosse Multi-Project-Builds eingesetzt an denen Maven trotz Consultants gescheitert ist.
Zeit für Neues.
#zitieren
Gravatar sascha 11.02.2010
um 18:55 Uhr
@Dirk: Vielleicht habe ich mich unklar ausgedrückt. Es soll eben nicht die ganze Freiheit geben. Gerade die ist problematisch. Der Vorteil bei Maven ist gerade die deklarative Herangehensweise. Wenn es in einem Build-System auch noch Variablen, Conditions und Schleifen gibt habe ich eine Programmiersprache. Gerade dies soll das Build-System eben nicht haben, damit ich mir nicht die ganzen damit behafteten Probleme herein hole.

Und wenn dann noch alle (okay, sogut kenne ich Gradle dann auch nicht) Groovy Feature zur Verfügung stehen, entstehen ganz schnell Build-Höllen wie bei grossen Ant Projekten. Alles hängt dann wieder von der Selbstdisziplin derjenigen ab, die das Build-System warten. Und die ist meistens... naja, wir sind eben Entwickler. Was wir nutzen können, nutzen wir.
#zitieren
Gravatar Dierk König 11.02.2010
um 20:52 Uhr
Gradle ist ein build-toolkit. Das kann man wohl so sagen. Und ja - man kann programmatisch eingreifen. Anders als bei reinem Ant hat man aber sinnvolle Defaults, die dazu führen, dass man nur dann eingreift, wenn es nötig ist.
Wenn das build-system notwendige Eingriffe mit zu grossen Hürden versieht, oder ganz unmöglich macht, dann ist das nicht nur ineffizient, sondern frustriert auch mit dem Ergebnis, dass man die Standards dann ganz verlässt, womit der Sache noch weniger gedient ist.
Ich bin bezüglich der Entwickler optimistischer. Gerade im Build tummeln sich nur wenige für die Selbstverwirklichung. Die meisten möchten doch möglichst wenig Arbeit damit haben und nutzen die Standards.
#zitieren

Folgende Links könnten Sie auch interessieren

zurück zum Seitenanfang