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.xml
i przełamania tej bariery „bez skryptu”.
Odwoływanie się do zależności
Podobnie package.json
, nie pracujesz bezpośrednio ze pom.xml
swoją 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.