Warum brauchen wir Maven oder Ant, wenn wir bereits Eclipse haben?


76

Ich denke, diese Frage ist eine Erweiterung von Compare to the IDE für Java. Brauchen wir noch Ant?

Es gibt Antworten auf die obige Frage, aber ich möchte ein konkretes Beispiel für die Verwendung von Maven oder Ant über Eclipse wissen.

Wenn ich in Eclipse entwickle, erledigt Eclipse alles für mich und ich muss nur auf die Schaltfläche Ausführen klicken. Außerdem können Sie mit Eclipse Ihren Code in eine ausführbare JAR- oder sogar EXE-Datei für Windows exportieren.

Ich weiß wirklich nicht, warum ich Maven oder Ant brauche.

Und auch wenn ich brauche, welches soll ich wählen, Maven oder Ant?


7
Arbeitest du in einem team
Thorbjørn Ravn Andersen

23
Ihr Unternehmen entscheidet, dass jede Nacht um 2 Uhr morgens ein automatischer Build ausgeführt werden soll. Möchten Sie zu diesem Zeitpunkt arbeiten müssen, um durch den Exportvorgang in Ihrer IDE zu klicken? Auch am Wochenende?
Donal Fellows

5
Ich sehe so viele Leute, die Eclipse und Ant benutzen, ohne diese sehr wichtige Frage zu stellen, die Jackson gestellt hat. Weiter so Jackson! Das Problem ist, dass die meisten Menschen / Unternehmen so beschäftigt sind, die Konkurrenz zu schlagen, dass sie nicht die Zeit haben, Tools und Techniken zu erlernen, mit denen sie viel mehr Zeit sparen können.
Nav

2
Ich stimme der Frage zu ... die meisten Entwickler beginnen mit der Verwendung dieser Tools, ohne sich zu fragen, warum ...
JanBo

1
Die nächste gute Frage lautet also: Warum brauchen wir Eclipse?
Lundin

Antworten:


87
  1. Weil Ihr Kollege möglicherweise NetBeans oder IDEA bevorzugt
  2. Da die Einstellungen von Eclipse-Installation zu Eclipse-Installation variieren können
  3. Weil Sie Ihre Abhängigkeiten möglicherweise automatisch abrufen möchten
  4. Weil Sie den gesamten Build automatisieren möchten: Build, JAR, statische Code-Analyse anwenden, Unit-Tests ausführen, Dokumentation erstellen, in ein Verzeichnis kopieren, einige Eigenschaften abhängig von der Umgebung optimieren usw.
  5. Denn sobald es automatisiert ist, können Sie ein kontinuierliches Integrationssystem verwenden, das die Anwendung bei jeder Änderung oder zu jeder Stunde erstellt, um sicherzustellen, dass alles noch erstellt wird und die Tests noch bestehen ...
  6. Weil Maven Konvention über Konfiguration verwendet.
  7. Da Ihre IDE möglicherweise keine ausgefallene Codegenerierung / -transformation unterstützt, die Sie benötigen.
  8. Weil ein Build-Skript den Build-Prozess dokumentiert.

Eclipse ist eine Entwicklungsumgebung. Aber es ist kein Build-Tool.

Ich persönlich hasse Maven, aber YMMV. Es gibt viele Alternativen: Gradle, Buildr usw.


3
6. weil Eclipse möglicherweise keine ausgefallene Codegenerierung /
-transformation unterstützt,

2
Eclipse ist eine Entwicklungsumgebung. Aber es ist kein Build-Tool. Nein, Eclipse ist ein Dummy-Build-Tool: P
Yorkw

5
Ich bin ein Java EE-Neuling, aber bisher konnte ich aus Eclipse ein WAR erstellen und problemlos auf Remote-Webservern bereitstellen. Nennen Sie mich verrückt, aber ich mag es, die Dinge einfach zu halten, und diese Build-Tools scheinen alles andere als ...
Dennis

1
Jemand muss den zweiten Punkt hervorheben: 2. Da die Einstellungen von Eclipse-Installation zu Eclipse-Installation variieren können . Für ANT lernst du einmal . Für Eclipse lernst du einmal pro Version und beschäftigst dich mit all den seltsamen Feinheiten und Fehlern, für die Eclipse so berühmt ist.
Pacerier

6. Weil Maven Konvention über Konfiguration verwendet. Dies ist nicht nur für Tools nützlich, sondern auch für Entwickler, da sie wissen, wo sie nach was suchen müssen. Ich habe bereits Projekte mit mehreren Codeverzeichnissen in src gesehen - eines davon ist test.
Hubert Grzeskowiak

11

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.


1
Als Experiment in einem ehemaligen Unternehmen ließ ein Team nach dem De-Mavenisieren des Builds den Maven-Build fortsetzen, während ein anderes den Eclipse-Build verwendete. Durch den Maven-Build konnte der Bauingenieur etwa 30 Minuten pro Monat sparen. Dies kostete Maven jedoch fast 3 Stunden pro Tag und Entwickler im Vergleich zum Eclipse-Build.
Das Richardson

Wir haben diese Tools ausprobiert und sie sind alle schwieriger als sie es wert sind. Ich bedaure nur, dass ich nur eine Stimme für Sie habe.
Vincent

1
"Ihr Build wird im Vergleich zu Entwicklern, die Eclipse verwenden, nur übermäßig langsam sein" Beweis oder Bearbeitung
Hubert Grzeskowiak

9
Diese Antwort ist ein riesiger Meinungshaufen ohne einen einzigen Hinweis oder Beweis für irgendetwas.
Hubert Grzeskowiak

Atme tief ein und zähle bis 10. Besser? Bist du ein Eclipse-Entwickler oder ein Eclipse-Fan oder so?
Nathan Adams

6

Die Verwendung von Ant oder Maven bietet so viele Vorteile.

Maven ist mehr oder weniger ein Update-Konzept von Ant. Anstatt Ihnen eine Stichpunktantwort zu geben, habe ich beschlossen, diese Frage auf andere Weise zu beantworten. Ich werde dir eine einfache Frage stellen. Ich gehe hier davon aus, dass Sie ein Entwickler sind. oder eine Art OO-Programmierhintergrund haben.

Wenn Ihr Manager Sie also bitten sollte, zweihundert Verzeichnisse zu kopieren, aber die jar, war and earDateien in diesen Verzeichnissen ignorieren und einmal kopieren. Anschließend stellen Sie diese zweihundert Verzeichnisse an einem anderen Ziel bereit, stellen jedoch nur .classDateien bereit. Kopieren Sie den Rest der Dateien in ein anderes Ziel usw.

Damit Sie dies in Java tun können; Es wird viel Logik, viel Code sein und wäre nicht erweiterbar oder anpassbar, um sich zu ändern. Damit Ant oder Maven dies alles im Handumdrehen mit weniger Aufwand für Ihre Anwendung erledigen und vorbereiten können. Die Größe des Codes in ant oder Maven wird 1/4mit Java verglichen.

Klicken Sie auf die Links für weitere technische Vorteile:

Maven

Ameise Ich konnte keine authentische Antwort mit Vorteilen finden, aber ich bin sicher, das würde dich überzeugen;)


5

Maven und Ant werden zum Erstellen von Skripten verwendet, damit sie in Batch-Jobs wie mit Jenkins oder in der Befehlszeile ausgeführt werden können.

Tatsächlich verwendet Eclipse selbst Ant ausgiebig, um Plugins zu erstellen.

Wenn Sie einen der beiden lernen, lernen Sie Maven, es ist derjenige, den heutzutage so ziemlich jeder benutzt (anstelle von Ant).


2
Gradle ist ziemlich beliebt, es wird jetzt in Android Studio verwendet
Barlop

2

Maven wird im Allgemeinen verwendet, um die Plugins oder Jars für eine bestimmte Anwendung zu erstellen.

Angenommen, Sie haben eine Anwendung entwickelt, möchten aber nicht die für diese Anwendung erforderlichen Gläser manuell hinzufügen. In dieser Situation ist Maven oder Ant sehr hilfreich. Sobald Sie Ihren Code so geschrieben haben, dass er ausgeführt wird als -> Maven Build (klicken Sie auf Maven Build), werden alle erforderlichen Plugins oder Jars generiert und in den Erstellungspfad Ihrer Anwendungsbibliothek aufgenommen. Es kann Zweifel geben, wie die Anwendung diese Gläser erhält. Für jede Anwendung gibt es eine XML-Datei mit dem Namen POM.xml, in der die Referenz aller Gläser zum Herunterladen aufbewahrt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.