Ist Maven ähnlich wie npm?

Lesezeit: 8 Minuten

Da ich mit npm gearbeitet habe, das nach Abhängigkeiten in der Datei package.json sucht und sie für Sie herunterlädt. Ebenso sehe ich eine pom.xml-Datei im Java-Projekt. Schaut Maven in dieser Datei nach und lädt Abhängigkeiten für mich herunter. Kann ich diese pom.xml-Datei wie package.json weitergeben, anstatt die Abhängigkeits-Jars zu geben? Sind diese Tools ähnlich und nur für verschiedene Plattformen entwickelt?

Benutzer-Avatar
Anton Košcejew

Gleiches Tool, andere Sprache?

Maven ist das beliebteste Build- und Abhängigkeitsauflösungstool für Java, genau wie NPM für JS. Aber es ist nicht nur das gleiche Tool für eine andere Sprache. Es gibt offensichtlich große Unterschiede zwischen Java- und JS-Builds, und diese Unterschiede sind direkt in der Art und Weise sichtbar, wie Maven funktioniert. Während beispielsweise viele JS-Tools auf Git angewiesen sind, um einige schwere Aufgaben zu erledigen, arbeitet Maven mit benutzerdefinierten dateisystembasierten Maven-Repositories, da Maven älter als Git ist und binäre Artefakte verarbeiten muss, die Git historisch nicht gut gehandhabt hat. In Maven gibt es eine klare Trennung zwischen Quellen und Binärdateien, während sie in der JS-Welt oft dasselbe sind.

Maven-Grundlagen

Maven in seiner reinsten Form folgt einem deklarativen Modell, wo pom.xml (ähnlich zu package.json) definiert verschiedene Eigenschaften des Builds, enthält jedoch keine Skripts. Der Nachteil ist, dass es eine Herausforderung sein kann, einige Aspekte des Builds zu optimieren, ohne Skripte zu verwenden, da Sie sich auf Plugins verlassen müssen. Der Vorteil ist, dass es einfacher sein kann, andere Builds zu verstehen, indem man sie einfach ansieht pom.xml, da sie normalerweise denselben Ansatz ohne zu viele Anpassungen verfolgen. Gradle ist ein beliebtes Groovy-basiertes Tool, das auf Maven-Standards und -Konventionen aufbaut und speziell zur Vereinfachung entwickelt wurde pom.xml und durchbrechen Sie diese „Kein-Skript“-Barriere.

Verweisen auf Ihre Abhängigkeiten

ähnlich zu package.jsonmit dem Sie nicht arbeiten pom.xml Ihrer Abhängigkeit direkt, sondern definieren Sie Abhängigkeitskoordinaten und lassen Sie Ihr Build-Tool den Rest erledigen. In Maven ist die Grundform dieser Koordinaten GAV (Gruppen-ID, Artefakt-ID, Version).

Flacher Abhängigkeitsbaum?

Basierend auf den Kommentaren in der anderen Antwort stellt Maven einen „flachen Abhängigkeitsbaum“ bereit, nicht einen „verschachtelten Abhängigkeitsbaum“, den NPM standardmäßig bereitstellt. Maven erlaubt nicht mehrere Versionen derselben Abhängigkeit. Kommt es vor, dass unterschiedliche Versionen angefordert werden, verwendet Maven Abhängigkeitsauflösung um eine einzelne Version auszuwählen. Dies bedeutet, dass Ihre transitiven Abhängigkeiten manchmal eine andere Version erhalten, als sie erfordern, aber es gibt Möglichkeiten, dies zu verwalten. Diese Einschränkung kommt jedoch von Java, nicht von Maven, da (normalerweise) in Java ein Klassenlader nur Zugriff auf eine einzelne Klassendefinition bietet, selbst wenn mehrere Definitionen im Klassenpfad gefunden werden. Da Java damit nicht besonders gut umgehen kann, versucht Maven dieses Szenario von vornherein zu vermeiden.

Hinweis: Seit npm v3 sind die Abhängigkeiten abgeflacht. Der alternative Paketmanager Garn macht auch das gleiche.

Die Reife

Darüber hinaus ist Maven wesentlich älter als NPM, hat eine größere Benutzerbasis, eine große Anzahl von benutzerdefinierten Plugins und könnte bisher wahrscheinlich insgesamt als ausgereifter angesehen werden. Manchmal wird Maven für Nicht-Java- oder sogar polyglotte Projekte verwendet, da es Plugins für den Umgang mit anderen Sprachen oder bestimmten Umgebungen wie Android gibt. Es gibt Plugins, die Maven und andere Build-Tools überbrücken, wie z Frontend-Maven-Plugin das tatsächlich mehrere JS-Build-Tools verarbeitet.

  • Zusätzlich zu den oben genannten Informationen die folgenden Youtube-Playlist leistet großartige Arbeit und beschreibt die Verwendung von Maven als Paketmanager

    – Tommi Thompson

    12. Mai 2017 um 3:59 Uhr


  • Ich besuche oft npmjs.com, um nach einem Paket zu suchen, das hilfreich sein könnte. Es hat ziemlich viel gegoogelt, um einen Link dafür auf Maven zu finden (search.maven.org). Suchvorgänge verweisen mich jedoch nicht auf Dokumente, zeigen mir keine Popularitätsmetriken und verweisen nicht auf Github. Ich finde es nicht hilfreich, was darauf hindeutet, dass die Leute dies von NPM erwarten, aber nicht von Maven.

    – Joe Lapp

    7. November 2017 um 14:38 Uhr


  • Ein ziemlich guter statistischer Vergleich zwischen NPM und Maven ist hier: stackshare.io/stackups/npm-vs-gradle

    – Clifford Fajardo

    28. Januar 2018 um 21:59 Uhr

  • Ein Update zu dieser Antwort: „Darüber hinaus ist Maven erheblich älter als NPM, hat eine größere Benutzerbasis …“ Dies war wahrscheinlich zutreffend, als die Frage ursprünglich im Jahr 2017 beantwortet wurde, ist aber nicht mehr zutreffend. Laut dem von @cacoder geposteten Link ist die Benutzerbasis von NPM jetzt etwa 11x größer als die von Maven. Quelle: stackshare.io/stackups/gradle-vs-maven-vs-npm

    – mnutsch

    26. März 2019 um 18:30 Uhr

  • Wie aber beginnt man mit der Erstellung eines Projekts mit Maven? Diese Antwort ist gründlich, aber es klingt, als würde sie eine Situation beschreiben, in der es eine gibt pom.xml Datei schon. Aber was ist, wenn Sie ein neues Projekt erstellen möchten? In Node.js würde ich das tun mkdir <dir>; cd <dir>; npm init -f. Das npm Das Tool kann standardmäßig ein neues Projekt erstellen, und ich muss keinen Archtyp auswählen, mit dem ich beginnen möchte.

    – Matt Welke

    2. Mai 2021 um 2:29 Uhr


Benutzer-Avatar
Marinos An

Unten verwende ich | zwischen maven | zu trennen npm-Terme jeweils:

Gemeinsamkeiten:

  • Beide Tools unterstützen dynamischer Abruf von Abhängigkeiten ( Artefakte | Pakete ) basierend auf einer Deskriptordatei pom.xml|package.jsonund erlauben es Ihnen auch bereitstellen | veröffentlichen dein eigenes Artefakte | Pakete.

  • Beide haben eine Standardöffentlichkeit Aufbewahrungsort | Registrierung ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org), aber auch Drittanbieter können verwendet werden (via settings.xml|.npmrc ).

  • Beide unterstützen das Konzept von Abhängigkeiten auf Build-Ebene (in Skripten verwendete Plugins | devDependencies). *Maven unterstützt provided Abhängigkeiten, aber dies scheint für npm nicht zu gelten, da Javascript selten in Containern bereitgestellt wird.

  • Beide unterstützen Abhängigkeitsnamensräume: groupId|scope

Unterschiede:

  • Maven hat eine zusätzliche lokales Repository(Zwischenspeicher):

    • Es ist nicht erforderlich, dieselbe Abhängigkeit für verschiedene Projekte erneut abzurufen.
    • Lokal installierte Artefakte sind automatisch für andere lokale Projekte zugänglich.
  • Abhängigkeiten von einem in Maven eingebauten Projekt werden heruntergeladen <homedir>/.m2. Mit npm werden sie heruntergeladen <projectdir>/node_modules.

  • Einbauen Maven ist üblicherweise a einstufiger Prozess: mvn package (deps holen, bauen). In npm ist es ein zweistufiger Prozess: npm install (Abruf abrufen) , npm build (bauen)

  • Maven definiert Lebenszyklen aufbauen (zum Bauen, Testen, Bereitstellen) bestand aus Phasen, an die sich Standardoperationen (Plugin-Ziele) anschließenbasierend auf verschiedenen Verpackungsoptionen (.jar,.war,.ear etc). Sie können diese Operationen dann überschreiben oder neue einfügen (über das Plugin-System). Dies bietet eine Art Out-of-the-Box-Lösung für Build, Docgen, Test, Deployment usw
    Der npm-Ansatz ist einfacher (siehe: Skripte)

  • Aus diesem Grund wird npm als a bezeichnet Paketverwaltungstool für Javascript während maven als a gekennzeichnet ist Build-Automatisierungs- und Abhängigkeitsverwaltungstool für Java.

  • Beim Maven-Setup beinhaltet der Build-Prozess häufiger Bearbeiten der pom.xml.
    In npm geht es um Code schreiben oder konfigurieren ergänzende Build-Tools wie gulp,webpack etc

  • Aus irgendeinem Grund Versionsbereiche die von Benutzern in npm-Modulen definiert werden, sind viel mehr lose als in maven. Dies kann zu Problemen mit transitiven Abhängigkeiten führen, weshalb kürzlich eine zusätzliche Datei hinzugefügt wurde: package-lock.json

  • Mit npm ist es viel mehr unkompliziert zu starten ein neues Projekt: npm init. Bei Maven müssen Sie wissen, wie man ein Minimum schreibt pom.xmloder lesen Sie etwas über Archetypen.

  • Im Allgemeinen ist es viel üblicher, zu bearbeiten pom.xml als package.json. Z.B Hinzufügen von Abhängigkeiten in Maven erledigt manuell (oder über IDE) während in npm über die Kommandozeile.

  • Wie bei allen Build-Tools können Sie ein Tool innerhalb des anderen aufrufen, aber ich denke, es ist viel üblicher, es aufzurufen npm von innerhalb von mavenals das Gegenteil.

  • npm unterstützt Entwicklung, Produktion baut. In Maven muss dies durch definiert werden Profile.

Jawohl. Es ist ein ähnliches Verpackungstool für Java. suchen gradle auch das gibt Ihnen mehr Freiheit mit groovy languageaber für den Anfang können Sie verwenden maven um Ihre Abhängigkeiten zu organisieren. Sie fügen sie dort als Tags ein und Maven erledigt die Arbeit für Sie.

Es durchläuft den Abhängigkeitsbaum und lädt alle entsprechenden JAR-Dateien herunter.

  • Ich bin mir nicht sicher, weil ich mit all diesen js-Tools nicht so vertraut bin. gradle ist maven + ant sagen wir zusammen. Es tut, was Maven tut, aber es gibt Ihnen auch die Freiheit, Code und Skripte zu schreiben, abgesehen von all den De-facto-Jobs, die es erledigt. ich habs mir angeschaut gulp gerade jetzt. vielleicht ist es das gleiche, wie ich gelesen habe. Wenn Sie maven vs gradle verwenden möchten, würde ich vorschlagen, mit zu beginnen maven das ist klarer und leichter zu verstehen und dann durcheinander zu bringen gradle!

    – Apostolos

    15. Juli 2016 um 6:20 Uhr


  • Vielen Dank. Hat Maven einen flachen Abhängigkeitsbaum oder einen verschachtelten Abhängigkeitsbaum?

    – Shubham Jain

    15. Juli 2016 um 6:21 Uhr

  • Siehe zB hier mvnrepository.com/artifact/org.hibernate/hibernate-core/…. Hibernate hängt von verschiedenen anderen Bibliotheken ab, aber diese Gläser werden nicht im lokalen Maven-Repo innerhalb der Hibernate-Bibliothek gespeichert, sondern in ihren eigenen Paketen.

    – Apostolos

    15. Juli 2016 um 6:27 Uhr

  • Ich denke, es gibt einen Unterschied im Umgang mit verschachtelten (transitiven) Abhängigkeiten. Jedes Knotenmodul kann seine eigene Version einer Abhängigkeit enthalten, während Maven versucht, in eine einzige gemeinsame Abhängigkeit aufzulösen, wenn mehrere Abhängigkeiten dieselbe dritte Abhängigkeit erfordern, jedoch in einer anderen Version. Ich würde auch sagen, Grunt passt zu Gradle, da es aufgabenbasiert ist. Gradle ist eher Ant+Efeu, während Maven stark konventionsgetrieben ist. vielleicht näher an Webpack, aber nichts zu ähnlich.

    – Wemu

    15. Juli 2016 um 6:48 Uhr

  • Entschuldigung, Sie haben recht. verwechselt es mit dem Profilerstellungsverfahren, das ich manchmal verwende und definiere die Versionen.

    – Apostolos

    15. Juli 2016 um 9:51 Uhr

Ja, dasselbe gilt für Gradle, aber sie sind nicht benutzerfreundlich wie npm.

1311370cookie-checkIst Maven ähnlich wie npm?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy