Той самий інструмент, інша мова?
Maven - найпопулярніший інструмент збірки та вирішення залежностей для Java, як і NPM для JS. Але це не просто той самий інструмент для іншої мови. Очевидно, що між побудовами Java та JS є величезні відмінності, і ці відмінності безпосередньо видно з того, як працює Maven. Наприклад, в той час як багато інструментів JS покладаються на Git для важкого підйому, Maven працює зі спеціальними сховищами Maven на основі файлової системи, оскільки Maven передує Git і повинен обробляти двійкові артефакти, з якими Git історично не справлявся. У Maven існує чітке розділення між джерелами та двійковими файлами, хоча в світі JS вони часто однакові.
Основи Maven
Maven у чистому вигляді дотримується декларативної моделі, де pom.xml
(подібно до package.json
) визначає різні властивості збірки, але не містить сценаріїв. Недоліком є те, що може бути складно налаштувати деякі аспекти збірки без використання сценаріїв, оскільки вам доведеться покладатися на плагіни. Перевага полягає в тому, що легше зрозуміти інші збірки, просто подивившись pom.xml
, оскільки вони, як правило, застосовують один і той же підхід без зайвих налаштувань. Gradle - це популярний інструмент на основі Groovy, побудований на основі стандартів та конвенцій Maven і спеціально розроблений для спрощення pom.xml
та подолання цього бар'єру "без сценарію".
Посилання на ваші залежності
Подібно до цього package.json
, ви не працюєте безпосередньо зі pom.xml
своєю залежністю, а навпаки, визначаєте координати залежностей, і дозволяєте інструменту побудови обробляти все інше. У Maven основною формою цих координат є GAV (groupId, artifactId, версія).
Плоске дерево залежностей?
На основі коментарів в іншій відповіді Maven надає "плоске дерево залежностей", а не "вкладене дерево залежностей", яке NPM надає за замовчуванням. Maven не допускає декілька версій однієї і тієї ж залежності. Якщо трапляються запити на різні версії, Maven використовує дозвіл на залежність, щоб вибрати одну версію. Це означає, що іноді ваші транзитивні залежності отримають іншу версію, ніж вони вимагають, але є способи управління цим. Однак це обмеження походить від Java, а не від Maven, оскільки (як правило) в Java завантажувач класів надає доступ лише до одного визначення класу, навіть якщо на шляху до класу знайдено кілька визначень. Оскільки Java не особливо добре справляється з цим, Maven намагається уникати цього сценарію.
Примітка: з npm v3 залежності згладжуються. Альтернативна пряжа менеджера пакетів також робить те ж саме.
Зрілість
Крім того, Maven значно старший за NPM, має більшу базу користувачів, величезну кількість користувацьких плагінів, і досі, мабуть, може вважатися більш зрілим в цілому. Іноді Maven використовується для проектів, що не пов'язані з Java, або навіть для поліглотів, оскільки існують плагіни для обробки інших мов або певних середовищ, таких як Android. Є плагіни, які поєднують Maven та інші інструменти побудови, такі як frontend-maven-plugin, який насправді обробляє кілька інструментів побудови JS.