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?
83
Antworten:
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 wiepackage.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 verstehenpom.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, umpom.xml
diese Barriere ohne Skript zu vereinfachen und zu überwinden.Verweisen auf Ihre Abhängigkeiten
Ähnlich arbeiten
package.json
Sie nichtpom.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.
quelle
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.json
und 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
provided
Abhä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):
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
,.ear
usw.). 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. Dernpm-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 des
pom.xml
.In npm beinhaltet es das Schreiben von Code oder Konfiguration von komplementären Build - Tool wie
gulp
,webpack
etcAus 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 schreibtpom.xml
oder über Archetypen liest.Im Allgemeinen ist es viel häufiger zu bearbeiten
pom.xml
alspackage.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 .
quelle
Ja. Es ist ein ähnliches Verpackungswerkzeug für Java. Suchen Sie
gradle
auch nach, was Ihnen mehr Freiheit gibtgroovy language
, aber zu Beginn können Siemaven
Ihre 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.
quelle
gradle
istmaven + ant
zusammen 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 mirgulp
gerade 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,maven
was klarer und leichter zu verstehen ist, und dann damit herumzuspielengradle
!Ja, das gleiche gilt für gradle, aber sie sind nicht so benutzerfreundlich wie npm.
quelle