Ist Maven npm ähnlich?

83

Da ich mit npm gearbeitet habe, sucht das nach Abhängigkeiten in der Datei package.json und lädt es für Sie herunter. Ebenso sehe ich eine pom.xml-Datei in einem Java-Projekt. Sucht Maven in dieser Datei und lädt Abhängigkeiten für mich herunter. Kann ich diese pom.xml-Datei wie package.json weitergeben, anstatt die Abhängigkeitsgläser anzugeben? Sind diese Tools ähnlich und nur für verschiedene Plattformen geeignet?

Shubham Jain
quelle

Antworten:

123

Gleiches Werkzeug, andere Sprache?

Maven ist das beliebteste Tool zum Erstellen und Auflösen von Abhängigkeiten für Java, genau wie NPM für JS. Aber es ist nicht nur das gleiche Werkzeug für eine andere Sprache. Es gibt offensichtlich große Unterschiede zwischen Java- und JS-Builds, und diese Unterschiede sind direkt in der Funktionsweise von Maven sichtbar. Während beispielsweise viele JS-Tools auf Git angewiesen sind, um einige Aufgaben zu erledigen, arbeitet Maven mit benutzerdefinierten dateisystembasierten Maven-Repositorys, da Maven älter als Git ist und binäre Artefakte verarbeiten muss, mit denen Git in der Vergangenheit nicht gut umgehen konnte. 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, bei dem pom.xml(ähnlich wie package.json) verschiedene Eigenschaften des Builds definiert werden, das jedoch keine Skripte enthält. Der Nachteil ist, dass es eine Herausforderung sein kann, einige Aspekte des Builds ohne Verwendung von Skripten zu optimieren, da Sie sich auf Plugins verlassen müssen. Der Vorteil ist, dass es einfacher sein kann, andere Builds nur durch Betrachten zu verstehen pom.xml, da sie normalerweise den gleichen Ansatz verfolgen, ohne zu viele Anpassungen vorzunehmen. Gradle ist ein beliebtes Groovy-basiertes Tool, das auf Maven-Standards und -Konventionen basiert und speziell entwickelt wurde, um pom.xmldiese Barriere ohne Skript zu vereinfachen und zu überwinden.

Verweisen auf Ihre Abhängigkeiten

Ähnlich arbeiten package.jsonSie nicht pom.xmldirekt mit Ihrer Abhängigkeit, sondern definieren Abhängigkeitskoordinaten und lassen Ihr Build-Tool den Rest erledigen. In Maven ist die Grundform dieser Koordinaten GAV (groupId, artefaktId, version).

Flacher Abhängigkeitsbaum?

Basierend auf den Kommentaren in der anderen Antwort bietet Maven einen "flachen Abhängigkeitsbaum" und keinen "verschachtelten Abhängigkeitsbaum", den NPM standardmäßig bereitstellt. Maven erlaubt nicht mehrere Versionen derselben Abhängigkeit. Wenn unterschiedliche Versionen angefordert werden, verwendet Maven die Abhängigkeitsauflösung , um eine einzelne Version auszuwählen. Dies bedeutet, dass Ihre transitiven Abhängigkeiten manchmal eine andere Version erhalten als erforderlich, 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 dann Zugriff auf eine einzelne Klassendefinition bietet, wenn mehrere Definitionen im Klassenpfad gefunden werden. Da Java nicht besonders gut damit umgehen kann, versucht Maven, dieses Szenario zunächst zu vermeiden.

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

Reife

Darüber hinaus ist Maven erheblich ä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 Polyglot-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 verbinden, wie z. B. das Frontend-Maven-Plugin , das tatsächlich mehrere JS-Build-Tools verarbeitet.

Anton Koscejev
quelle
4
Zusätzlich zu den obigen Informationen leistet die folgende Youtube-Wiedergabeliste hervorragende Arbeit bei der Beschreibung von Mavens Verwendung als Paketmanager
Tommy Thompson,
1
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 ( search.maven.org ) zu finden. Suchanfragen verweisen mich jedoch nicht auf Dokumente, zeigen mir keine Beliebtheitskennzahlen an und zeigen nicht auf Github. Ich finde es nicht hilfreich, was darauf hindeutet, dass die Leute dies von NPM erwarten, aber nicht von Maven.
Joe Lapp
Ein ziemlich guter statistischer Vergleich zwischen NPM & Maven ist hier: stackshare.io/stackups/npm-vs-gradle
cacoder
1
Ein Update zu dieser Antwort: "Außerdem ist Maven erheblich älter als NPM, hat eine größere Benutzerbasis ..." Dies traf wahrscheinlich zu, als die Frage ursprünglich 2017 beantwortet wurde, ist aber nicht mehr korrekt. 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
27

Unten |trenne ich zwischen maven | npm Begriffe jeweils:

Gemeinsamkeiten:

  • Beide Tools unterstützen das dynamische Abrufen von Abhängigkeiten ( Artefakte | Pakete ) basierend auf einer Deskriptordatei pom.xml| package.jsonund ermöglichen Ihnen auch die Bereitstellung von | veröffentlichen Sie Ihre eigenen Artefakte | Pakete .

  • Beide haben ein öffentliches Standard- Repository | Registrierung ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), aber auch Drittanbieter können verwendet werden (über settings.xml|.npmrc ).

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

  • Beide unterstützen den Namespace für Abhängigkeiten: groupId|scope

Unterschiede:

  • Maven hat ein zusätzliches lokales Repository (Cache):

    • Es ist nicht erforderlich, dieselbe Abhängigkeit für verschiedene Projekte erneut abzurufen.
    • Auf lokal installierte Artefakte kann automatisch von anderen lokalen Projekten zugegriffen werden.
  • Abhängigkeiten von einem in maven erstellten Projekt werden in heruntergeladen <homedir>/.m2. Mit npm werden sie heruntergeladen <projectdir>/node_modules.

  • Das Erstellen in Maven ist normalerweise ein einstufiger Prozess : mvn package(Deps abrufen, Build). In npm ist es ein zweistufiger Prozess: npm install(Deps abrufen), npm build(Build)

  • Maven definiert Lifecycles bauen (für das Erstellen, Testen, Implementierung) bestand aus Phasen, auf die Standardoperationen (Plugin Tore) befestigen , basierend auf differVerpackungsOptionen ( .jar, .war, .earusw.). Sie können diese Vorgänge 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 Paketverwaltungstool für Javascript bezeichnet, während maven als Build-Automatisierungs- und Abhängigkeitsverwaltungstool für Java bezeichnet wird .

  • Beim Einrichten von Maven umfasst der Erstellungsprozess häufiger das Bearbeiten despom.xml .
    In npm beinhaltet es das Schreiben von Code oder Konfiguration von komplementären Build - Tool wie gulp, webpacketc

  • Aus irgendeinem Grund sind Versionsbereiche, die von Benutzern in npm-Modulen definiert wurden, viel lockerer als in maven. Dies kann Probleme mit transitiven Abhängigkeiten verursachen. Aus diesem Grund wurde kürzlich eine zusätzliche Datei hinzugefügt:package-lock.json

  • Mit npm ist es viel einfacher, ein neues Projekt zu starten : npm init. Mit maven müssen Sie wissen, wie man ein Minimal schreibt pom.xmloder über Archetypen liest.

  • Im Allgemeinen ist es viel häufiger zu bearbeiten pom.xmlals package.json. Das Hinzufügen von Abhängigkeiten in maven erfolgt beispielsweise manuell (oder über IDE), während in npm über die Befehlszeile .

  • Wie bei allen Build-Tools können Sie ein Tool aus dem anderen heraus aufrufen, aber ich denke, es ist viel üblicher, npm aus dem Inneren von maven heraus aufzurufen , als das Gegenteil.

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

Marinos An
quelle
5

Ja. Es ist ein ähnliches Verpackungswerkzeug für Java. Suchen Sie gradleauch nach, was Ihnen mehr Freiheit gibt groovy language, aber zu Beginn können Sie mavenIhre Abhängigkeiten organisieren. Sie fügen sie dort als Tags hinzu und Maven erledigt die Arbeit für Sie.

Es durchläuft den Abhängigkeitsbaum und lädt alle entsprechenden Gläser herunter.

Apostolos
quelle
1
Ich bin mir nicht sicher, weil ich mit all diesen Tools nicht so vertraut bin. gradleist maven + antzusammen sagen wir mal. Es macht das, was Maven macht, aber es gibt Ihnen auch die Freiheit, Code und Skripte zu schreiben, abgesehen von all den De-facto-Jobs, die es macht. Ich habe es mir gulpgerade angesehen. Vielleicht ist es das gleiche, was ich gelesen habe. Wenn Sie anfangen möchten, Maven vs Gradle zu verwenden, würde ich vorschlagen, damit zu beginnen, mavenwas klarer und leichter zu verstehen ist, und dann damit herumzuspielen gradle!
Apostolos
Vielen Dank. Hat Maven einen flachen Abhängigkeitsbaum oder einen verschachtelten Abhängigkeitsbaum?
Shubham Jain
1
zB siehe hier mvnrepository.com/artifact/org.hibernate/hibernate-core/… . Der Ruhezustand hängt von verschiedenen anderen Bibliotheken ab, aber diese Jars werden nicht im lokalen Maven-Repo in der Ruhezustand-Bibliothek gespeichert, sondern in ihren eigenen Paketen.
Apostolos
1
Ich denke, es gibt einen Unterschied im Umgang mit verschachtelten (transitiven) Abhängigkeiten. Jedes Knotenmodul kann eine eigene Version einer Abhängigkeit enthalten, während maven versucht, 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, Grunzen passt gradle seit seiner Aufgabe. Gradle ist eher Ameise + Efeu, während Maven stark von Konventionen bestimmt ist. Vielleicht näher am Webpack, aber nichts zu ähnliches.
wemu
1
Entschuldigung, Sie sind richtig. verwechselt es mit der Profilerstellungsprozedur, die ich manchmal benutze und die Versionen definiere.
Apostolos
0

Ja, das gleiche gilt für gradle, aber sie sind nicht so benutzerfreundlich wie npm.

LEMUEL ADANE
quelle