Maven scheint mir ein Fall von etwas zu sein, das von einer Reihe von C-Shell-Skriptkindern geschrieben wurde, die glauben, dass Autoconf eine hochmoderne Code-Automatisierung ist und nicht versteht, dass für Objektcode eine Objektumgebung erforderlich ist auf jeden Fall effizient für die Entwicklung oder Bereitstellung. Ant war schlimm genug, aber Maven kombiniert die schlimmsten Eigenschaften von Ant und Ivy. Es wird keine Objektumgebung erstellt und es funktioniert nicht gut mit Tools, die dies tun.
Eine Objektumgebung sollte einfach alle Klassenobjekte haben, dh die Objekte, die die Objekttypen bestimmen, die dem System zur Verfügung stehen, live und jederzeit verfügbar sind. Von dort aus kann ich tun, was ich will, mehrere Objekte einer Klasse instanziieren, verschiedene Sequenzen und Instanziierungsregeln einrichten usw. Da die Umgebung vollständig aktiv sein sollte, sollte ich sie nicht benötigenüberhaupt ein Build-Tool. In Bezug auf die Bereitstellung meiner App ist es für die Umgebung nicht schwierig, alle Klassenobjekte, auf die in den Namespaces meiner App niemals durch Code verwiesen wird, einfach wegzuwerfen. Der Müllsammler in der JVM macht heute fast dasselbe im laufenden Betrieb. Zu diesem Zeitpunkt habe ich eine Bereitstellungsumgebung, die aus meinen Objekten und allen Objekten (hauptsächlich Klassenobjekten) besteht, auf die meine Objekte verweisen, dh meiner Anwendung und allen Abhängigkeiten. So funktionieren virtuelle Maschinen. (Dass unsere VMs so schlecht geschrieben sind, dass wir eine Spring-VM auf einer Java-VM auf einer Linux-VM auf einer VMWare-VM auf einer anderen Linux-VM ausführen müssen, ist ein weiteres Beispiel für die Idiotie der Softwareentwicklung). Wenn Abhängigkeiten aktualisiert werden, ist es für die Umgebung einfach genug, den Entwickler aufzufordern, seinen alten Code mit den neuen Bibliotheken zusammenzuführen. Führen Sie den Code mit den neuen Bibliotheken bis zur älteren Version zusammen oder behalten Sie beide Versionen bei. Durch die Eingabeaufforderung wird der Entwickler aufgefordert, die geringfügigen Änderungen vorzunehmen, die manchmal erforderlich sind, um zu vermeiden, dass zwanzig Versionen jeder Bibliothek vorhanden sind, während Tools wie Maven die Tatsache verbergen, dass Sie über zwanzig Versionen verfügen, was zu einer massiven Aufblähung der Laufzeit führt, die in Java-Apps häufig vorkommt.
Im Java-Entwicklungsbereich kommt Eclipse einer richtigen Objektumgebung am nächsten, obwohl es viele Plugins gibt, die das Paradigma auf verschiedene Weise brechen. Die meisten Gründe für die Verwendung von Maven fallen bei kritischer Prüfung auseinander.
Netbeans und Idea sind überblähte Texteditoren, keine Objektumgebungen. Wenn Sie jedoch ihre Tools für etwas verwenden möchten, das nicht von Tausenden von Eclipse-Plugins abgedeckt wird, können Sie Eclipse-Projekte importieren und verwalten. Ihr Build ist im Vergleich zu Entwicklern nur übermäßig langsam mit Eclipse wären sie dann aber so langsam, wenn sie sowieso reine Netbeans- oder Idea-Projekte wären.
Kein ernsthafter Grund, Maven zu benutzen.
Die Leichtigkeit des Exportierens / Importierens von Einstellungen in Eclipse (etwas, das jedes Team in jeder IDE auf jeden Fall tun sollte) macht das Problem der unterschiedlichen Einstellungen nur zu Faulheit des Entwicklungsteams (oder zu einem religiösen Streit über Leerzeichen gegen Tabulatoren, lol) .
Auch dies ist kein ernstzunehmender Grund, Maven zu verwenden.
Teamumgebung? Zeigen Sie mir ein Team, das noch kein Repository wie GIT oder SVN verwendet. Warum müssen wir sowohl die Funktionalität als auch die Wartungsprobleme duplizieren, indem wir auch Nexus-Repos einrichten?
Das ist eigentlich ein guter Grund , Maven NICHT zu benutzen.
Server-Build ausführen? Eine großartige Idee, sollte das nicht durch Code ausgelöst werden, der tatsächlich im Quell-Repo eingecheckt ist , anstatt durch einen zufälligen Build, der zufällig an Nexus gesendet wird? Dies bringt einen Punkt gegen Git, insbesondere Git mit Maven. Da ich in Git nicht an einem Zweig arbeite, lokal teste und dann festschreibe (teilweise, weil mein lokaler Test nicht beweist, dass der Server-Build aufgrund von Unterschieden in der Maven-Konfiguration in Jenkins und Eclipse funktioniert), muss ich meine Änderungen festschreiben einen anderen Zweig, um zu sehen, dass der Server-Maven-Build fehlschlägt, und dann eine weitere Änderung festzuschreiben, um das Problem zu beheben, was zu einem unlesbaren Quellverlauf im Repo führt. Eingecheckter Code sollte zumindest Unit-Tests erstellen und bestehen, die garantiert werden sollten, wenn Git und Maven nicht im Bilde wären.
Das Exportieren eines Headless-Builds aus Eclipse ist trivial, wenn Sie es sich tatsächlich ansehen. Sie benötigen lediglich Ant oder Gradle, den bereits von Eclipse verwalteten Entwickler-Build und einige Eclipse-Jars (Eclipse exportiert alle erforderlichen Dateien für einen Headless-Build in a Verzeichnis oder Zip-Datei oder FTP an den Build-Server). Server-Build-Tools wie Hudson / Jenkins können aktualisierten Code aus den meisten Quell-Repos abrufen und jedes Build-Skript aufrufen. Es besteht keine Abhängigkeit von Maven. Mit Maven zwingen Sie Entwickler entweder dazu, ein Tool zu verwenden, das nur für Build-Ingenieure geeignet ist (die Größenordnungen, die zum Erstellen erforderlich sind, selbst mit M2E, reichen aus, um diesen Fall zu erstellen), oder Sie leben mit der Möglichkeit, dass der Server erstellt wird funktioniert nicht ganz wie der Workstation Build, der immer noch isttrue, wenn Sie den ganzen Aufwand der Integration der beiden mithilfe der Vielzahl von M2E-Plugins durchlaufen. In beiden Fällen erhalten Sie einen langsameren und fragileren Workstation-Build, um einen ebenso langsamen und fragileren Server-Build zu erzielen. Bei jedem Maven-basierten Projekt, an dem ich gearbeitet habe, sind vorübergehende Hudson / Jenkins-Fehler aufgetreten, die in Eclipse nicht angezeigt werden, es sei denn, Sie haben absolut jedes mögliche M2E-Plugin installiert und korrekt konfiguriert, und die meisten Entwickler tun dies nie.
Scheint ein weiterer guter Grund zu sein, Maven zu meiden.
Dies deckt einige der grundlegenderen Probleme mit Maven nicht ab, wie z. B. die Namespaces, die Java-Namespaces und XML-Namespaces beschädigen. Die Build-Unit (POM) hat keine Beziehung zu irgendetwas in der tatsächlichen Bereitstellungsumgebung (denken Sie beim Trennen darüber nach Was erreichen Sie über POMs tatsächlich mit dem fertigen Produkt? Nichts. Alles, was Sie damit erreichen, ist das falsche Gefühl, dass Sie Bedenken und Funktionen in verschiedene Build-Einheiten unterteilt haben, die alle ausgeführt werdenals ein monolithisches Stück Code); der Aufwand, komplexe Konfigurationsdateien manuell zu verwalten, was sich nur verschlimmert, wenn Sie OSGi oder einen anderen Container verwenden und andere Konfigurationsdateien, die die Maven-Konfiguration betreffen und von ihr betroffen sind, mit sehr geringem offensichtlichen Sinn verwalten müssen; die Probleme, die durch den Versuch verursacht wurden, Komponententests ohne eine vollständige Umgebung auszuführen, in der der Code ausgeführt werden kann; Die unzähligen Versionen nicht nur von Abhängigkeiten, sondern auch von Maven-spezifischen Plugins (ich habe tatsächlich gesehen, wie JAR Hell im Maven-Build selbst erstellt wurde, in dem mehrere Maven-Plugins widersprüchliche Abhängigkeiten verwendeten - eines der Probleme, die Maven lösen sollte .
Ja, Sie können mit Maven Objektcode erstellen. Sie können auch reinen Objektcode in C oder sogar in Assembler schreiben, aber ich weiß nicht, warum Sie das möchten.
Der beste Grund, Maven zu meiden, ist der phänomenale Arbeitsaufwand, der erforderlich ist, um eine Reihe von Projekten zu entmavenisieren, wenn Sie alle oben genannten Probleme (und zahlreiche andere, die nicht erwähnt wurden) satt haben.
Die von der C-Entwicklung geerbte Denkweise, dass der Entwicklungszyklus aus Schreiben von Code, Kompilieren, Zusammenstellen, Erstellen, Bereitstellen, Testen und erneuten Ausführen besteht, ist in einer Objektumgebung hoffnungslos veraltet. Irgendwann müssen wir allen Menschen mit dieser Einstellung sagen, dass sie neu lernen müssen, wie sie sich entwickeln sollen. Dies würde Maven, Git und eine Vielzahl anderer Tools überflüssig machen, die nur Zeit verschwenden.
Die Objektentwicklung sollte in einer Live-Objektumgebung erfolgen, in der eine Codeänderung beim Speichern getestet wird, da das geänderte Objekt aktiv ist. Die Bereitstellung sollte darin bestehen, nur Entwicklungsartefakte aus dieser Umgebung zu entfernen und eine Laufzeit zu erstellen, die alles enthält, was von der laufenden App in Entwicklung und Test verwendet wird.
Ich beschäftige mich derzeit mit einem Problem, das durch das Erstellen von Bereitstellungsassemblys für eine OSGi-App mithilfe des Maven-Assembly-Plugins verursacht wird. Die App funktioniert perfekt in der Eclipse-Umgebung, in der alle Codeänderungen in einem laufenden OSGi-Container in der Umgebung im laufenden Betrieb bereitgestellt werden. Die Konfiguration bleibt jedoch während des Maven-Assemblierungsprozesses nicht intakt, obwohl ein sehr guter Konfigurations- / Build-Ingenieur vorhanden ist, dessen einzige Aufgabe es ist, diesen Prozess durchzuführen. Wenn wir Maven loswerden würden (jetzt aufgrund der Menge an Code sehr schwierig, aber möglich) und das BNDTOOLS Eclipse-Plugin verwenden würden, könnten wir den Eclipse-Build einfach als Ant- oder Gradle-Headless-Build exportieren (beachten Sie, die OSGi-Entwickler, die BND und schreiben BNDTOOLS nichtMaven unterstützen, und aus gutem Grund wurde das Maven-Plugin von den Felix-Entwicklern geschrieben, die selbst Netbeans und Maven verwenden (und keine andere Live-Umgebung als am Ende des Bereitstellungszyklus), in der beide Tools dieselbe Umgebung wie Eclipse einrichten. ohne die GUI-Objekte, die sowieso nur für Entwickler gedacht sind. Das Ergebnis wäre eine identische Konfiguration und ein identischer Build für die Bereitstellung. Dies würde leicht 2-3 Stunden pro Tag pro Entwickler einsparen, die derzeit langsame Maven- oder M2E-Builds beobachten, und den Konfigurations- / Build-Ingenieur für weitere Tests der App auf den Bereitstellungshosts freigeben.
Das einzige große Hindernis besteht darin, die Denkweise des Schreibens / Kompilierens / Zusammenstellens / Erstellens / Bereitstellens / Testens zu überwinden. Wenn Sie so tun, als würden Sie auf einem VT100-Terminal von 1979 anstelle eines modernen Computers codieren, sind Sie kein "echter" Entwickler, sondern zeigen nur, dass Ihre Methoden 35 Jahre alt sind.
Von den Entwicklern im Team versteht keiner der anderen eine Live-Objektumgebung wie Eclipse so gut, dass sie als Live-Umgebung mit M2E und OSGi funktioniert, und sie sind Top-Entwickler. Sie waren einfach nicht damit konfrontiert zur Verbreitung veralteter Befehlszeilen-Entwicklungstools. Sie erkannten erst, dass dies möglich war , als wir Paare programmierten, um das Konfigurationsproblem zu lösen, und ich meinen Bildschirm teilte, was dazu führte, dass eines der anderen Teammitglieder ausrief: " Das ist." Wie du so verdammt schnell Code schreibst ", als er sah, dass sich mein Code sofort im OSGi-Hintergrundcontainer änderte. Ich kann eine Bash-Shell verwenden, wenn ich muss, z. B. wenn ich mir Protokolle auf einem Remote-Server ansehe Tatsächlich mache ich das ziemlich effizient, damit ich so schnell wie möglich aus dieser Umgebung herauskomme und ins 21. Jahrhundert zurückkehren kann.