Czy Maven jest podobny do npm?

88

Ponieważ pracowałem z npm, który szuka zależności w pliku package.json i pobiera go za Ciebie. Podobnie widzę plik pom.xml w projekcie Java. Czy maven szuka w tym pliku i pobiera zależności dla mnie. Czy mogę przekazać ten plik pom.xml, taki jak package.json, zamiast podawać pliki jars zależności? Czy te narzędzia są podobne i są tworzone tylko dla różnych platform?

Shubham Jain
źródło

Odpowiedzi:

127

To samo narzędzie, inny język?

Maven to najpopularniejsze narzędzie do budowania i rozwiązywania zależności dla języka Java, podobnie jak NPM dla JS. Ale to nie jest tylko to samo narzędzie dla innego języka. Istnieją oczywiście ogromne różnice między kompilacjami Java i JS, a różnice te są bezpośrednio widoczne w sposobie działania Mavena. Na przykład, podczas gdy wiele narzędzi JS polega na Git, aby wykonać pewne ciężkie prace, Maven pracuje z niestandardowymi repozytoriami Maven opartymi na systemie plików, ponieważ Maven jest starszy od Gita i musi obsługiwać artefakty binarne, z którymi Git dawniej nie radził sobie dobrze. W Maven istnieje wyraźne oddzielenie źródeł od plików binarnych, podczas gdy w świecie JS często są one tym samym.

Podstawy Mavena

Maven w swojej najczystszej formie kieruje się modelem deklaratywnym, w którym pom.xml(podobnie package.json) definiuje różne właściwości kompilacji, ale nie zawiera skryptów. Wadą jest to, że dopracowanie niektórych aspektów kompilacji bez używania skryptów może być wyzwaniem, ponieważ musisz polegać na wtyczkach. Zaletą jest to, że łatwiej jest zrozumieć inne kompilacje, patrząc na nie pom.xml, ponieważ zwykle stosują to samo podejście bez zbytniego dostosowywania. Gradle jest popularnym narzędziem opartym na Groovy, opartym na standardach i konwencjach Maven, zaprojektowanym specjalnie w celu uproszczenia pom.xmli przełamania tej bariery „bez skryptu”.

Odwoływanie się do zależności

Podobnie package.json, nie pracujesz bezpośrednio ze pom.xmlswoją zależnością, ale raczej definiujesz współrzędne zależności i pozwalasz narzędziu kompilacji zająć się resztą. W Maven podstawową formą tych współrzędnych jest GAV (groupId, artifactId, version).

Płaskie drzewo zależności?

Opierając się na komentarzach w drugiej odpowiedzi, Maven dostarcza „płaskie drzewo zależności”, a nie „zagnieżdżone drzewo zależności”, które NPM dostarcza domyślnie. Maven nie zezwala na wiele wersji tej samej zależności. Jeśli zdarzy się, że żądane są różne wersje, Maven używa rozwiązania zależności, aby wybrać jedną wersję. Oznacza to, że czasami zależności przechodnie otrzymają inną wersję niż wymagają, ale są sposoby, aby sobie z tym poradzić. Jednak to ograniczenie pochodzi z Javy, a nie Mavena, ponieważ (normalnie) w Javie program ładujący klasy zapewnia dostęp tylko do jednej definicji klasy, nawet jeśli w ścieżce klas znajduje się wiele definicji. Ponieważ Java nie radzi sobie z tym zbyt dobrze, Maven stara się przede wszystkim uniknąć tego scenariusza.

Uwaga: od npm v3 zależności są spłaszczane. Alternatywna przędza menedżera pakietów również robi to samo.

Dojrzałość

Co więcej, Maven jest znacznie starszy niż NPM, ma większą bazę użytkowników, ogromną liczbę niestandardowych wtyczek i jak dotąd można go prawdopodobnie uznać za bardziej dojrzały. Czasami Maven jest używany w projektach innych niż Java lub nawet w projektach poliglotowych, ponieważ istnieją wtyczki do obsługi innych języków lub określonych środowisk, takich jak Android. Istnieją wtyczki, które łączą Mavena i inne narzędzia do budowania, takie jak wtyczka frontend-maven-plugin, która faktycznie obsługuje wiele narzędzi do budowania JS.

Anton Koscejev
źródło
4
Oprócz powyższych informacji, poniższa lista odtwarzania YouTube świetnie się spisuje, opisując wykorzystanie Mavena jako menedżera pakietów
Tommy Thompson,
2
Często odwiedzam npmjs.com, aby wyszukać pakiet, który może być pomocny. Znalezienie linku umożliwiającego zrobienie tego w witrynie Maven ( search.maven.org ) zajęło sporo czasu . Jednak wyszukiwania nie kierują mnie do dokumentów, nie pokazuj wskaźników popularności, nie wskazują na github. Nie wydaje mi się to pomocne, sugerując, że jest to coś, czego ludzie oczekują od NPM, ale nie od Mavena.
Joe Lapp
Całkiem dobre porównanie statystyczne między NPM i Maven jest tutaj: stackshare.io/stackups/npm-vs-gradle
cacoder
2
Aktualizacja tej odpowiedzi: „Co więcej, Maven jest znacznie starszy niż NPM, ma większą bazę użytkowników…” Prawdopodobnie tak było, gdy odpowiedź na pytanie została udzielona w 2017 roku, ale nie jest już dokładna. Zgodnie z linkiem opublikowanym przez @cacoder, baza użytkowników NPM jest teraz około 11 razy większa niż Mavena. Źródło: stackshare.io/stackups/gradle-vs-maven-vs-npm
mnutsch
31

Poniżej używam | do oddzielenia maven | terminy npm odpowiednio:

Wspólne cechy:

  • Oba narzędzia obsługują dynamiczne pobieranie zależności ( artefaktów | pakietów ) na podstawie pliku deskryptora pom.xml| package.json, a także umożliwia wdrażanie | publikuj własne artefakty | pakiety .

  • Obaj mają domyślne repozytorium publiczne | register ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), ale można również użyć innych firm (przez settings.xml|.npmrc ).

  • Oba wspierają koncepcję zależności na poziomie kompilacji (wtyczki | devDependencies używane w skryptach) . * Maven obsługuje providedrównież zależności, ale wydaje się, że nie dotyczy to npm, ponieważ javascript jest rzadko wdrażany w kontenerach.

  • Oba obsługują przestrzeń nazw zależności: groupId|scope

Różnice:

  • maven ma dodatkowe repozytorium lokalne (cache):

    • Nie ma potrzeby ponownego pobierania tej samej zależności dla różnych projektów.
    • Artefakty, które są instalowane lokalnie, są automatycznie dostępne dla innych projektów lokalnych.
  • zależności z projektu kompilowanego w maven są pobierane w <homedir>/.m2. Z npm są pobierane w formacie <projectdir>/node_modules.

  • Budowanie w maven jest zwykle procesem jednoetapowym : mvn package(pobieranie dokumentacji, budowanie). W npm jest to proces dwuetapowy: npm install(pobierz deps), npm build(build)

  • Maven definiuje kompilacji cyklu życia (do budowania, testowania, wdrażania) składała się z etapów, do których standardowe operacje (goals plugin) przymocowanie , w oparciu o differrent opcji opakowaniowych ( .jar, .war, .earetc). Możesz wtedy nadpisać te operacje lub wprowadzić nowe (za pośrednictwem systemu wtyczek). Zapewnia to rodzaj gotowego rozwiązania do kompilacji, docgen, testowania, wdrażania itp.Podejście
    npm jest bardziej uproszczone (patrz: skrypty )

  • W związku z powyższym npm jest oznaczony jako narzędzie do zarządzania pakietami dla javascript, podczas gdy maven jest oznaczony jako narzędzie do automatyzacji kompilacji i zarządzania zależnościami dla java .

  • W Maven konfigurowanie procesu kompilacji częściej obejmuje edycję plikupom.xml .
    W KMP wiąże pisania kodu lub konfiguracji komplementarne narzędzia kompilacji jak gulp, webpacketc

  • Z jakiegoś powodu zakresy wersji definiowane przez użytkowników w modułach npm są dużo bardziej luźne niż w maven. Może to powodować problemy z zależnościami przechodnimi, dlatego ostatnio dodano dodatkowy plik:package-lock.json

  • Z KMP jest o wiele bardziej proste, aby rozpocząć nowy projekt: npm init. Z mavenem musisz wiedzieć, jak napisać minimalizm pom.xmllub poczytać o archetypach.

  • Ogólnie znacznie częściej edytuje się pom.xmlniż package.json. Np. Dodawanie zależności w maven odbywa się ręcznie (lub przez IDE) w npm za pomocą wiersza poleceń .

  • Podobnie jak w przypadku wszystkich narzędzi do budowania, możesz wywołać jedno narzędzie z wnętrza drugiego, ale myślę, że znacznie częściej wywołuje się npm z wewnętrznego maven , niż odwrotnie.

  • npm obsługuje wersje deweloperskie, produkcyjne . W maven należy to zdefiniować za pomocą profili .

Marinos An
źródło
5

tak. jest to podobne narzędzie do pakowania dla java. szukaj gradlerównież tego, co daje ci więcej swobody groovy language, ale na początek możesz użyć mavendo uporządkowania swoich zależności. umieszczasz je tam jako tagi, a maven wykona pracę za Ciebie.

przechodzi przez drzewo zależności i pobiera wszystkie odpowiednie pliki JAR.

Apostolos
źródło
1
nie jestem pewien, ponieważ nie znam wszystkich tych narzędzi js. powiedzmy, gradlejest maven + antrazem. robi to, co robi maven, ale daje również swobodę pisania kodu i skryptów poza wszystkimi faktycznymi zadaniami, które wykonuje. gulpWłaśnie się temu przyjrzałem . może to to samo, z tego co przeczytałem. jeśli chcesz zacząć używać maven vs gradle, proponuję zacząć od tego, mavenco jest bardziej przejrzyste i łatwiejsze do zrozumienia, a następnie zepsuć gradle!
Apostolos
Dzięki. Czy maven ma płaskie drzewo zależności czy zagnieżdżone drzewo zależności?
Shubham Jain
1
np. zobacz tutaj mvnrepository.com/artifact/org.hibernate/hibernate-core/… . hibernacja zależy od różnych innych bibliotek, ale te pliki jar nie będą przechowywane w lokalnym repozytorium mavena wewnątrz biblioteki hibernacji, ale we własnych pakietach.
Apostolos
1
Myślę, że istnieje różnica w obsłudze zagnieżdżonych (przechodnich) zależności. każdy moduł węzła może zawierać własną wersję zależności, podczas gdy maven spróbuje rozwiązać jedną wspólną zależność, jeśli kilka zależności wymaga tej samej trzeciej zależności, ale w innej wersji. Powiedziałbym również, że grunt dopasowuje gradle, ponieważ jest oparty na zadaniach. gradle to bardziej ant + ivy, podczas gdy maven jest silnie nastawiony na konwencje. może bliżej do webpacka, ale nic zbyt podobnego.
wemu
1
przepraszam, masz rację. pomylił to z procedurą budowania profilu, której czasami używam i definiuję wersje.
Apostolos
0

Tak, to samo z gradle, ale nie są one przyjazne dla użytkownika jak npm.

LEMUEL ADANE
źródło