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.xml
diese Barriere ohne Skript zu vereinfachen und zu überwinden.
Verweisen auf Ihre Abhängigkeiten
Ähnlich arbeiten package.json
Sie nicht pom.xml
direkt 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.