Подтвердить что ты не робот

Является ли Maven похожим на npm?

Как я работал с npm, который ищет зависимости в файле package.json и загружает его для вас. Аналогично, я вижу файл pom.xml в проекте Java. Является ли maven в этом файле и загружает зависимости для меня. Могу ли я передать этот файл pom.xml, например package.json, вместо того, чтобы давать баны зависимости? Являются ли эти инструменты похожими и просто созданы для разных платформ?

4b9b3361

Ответ 1

Тот же инструмент, другой язык?

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 и преодоления этого барьера "no script".

Ссылка на ваши зависимости

Аналогично package.json, вы не работаете с pom.xml вашей зависимости напрямую, а скорее определяете координаты зависимостей и позволяете инструменту построения обрабатывать остальные. В Maven основной формой этих координат является GAV (groupId, artifactId, версия).

Дерево плоской зависимости?

Основываясь на комментариях в другом ответе, Maven предоставляет "плоское дерево зависимостей", а не "вложенное дерево зависимостей", которое NPM предоставляет по умолчанию. Maven не разрешает несколько версий одной и той же зависимости. Если бывает, что запрашиваются разные версии, Maven использует разрешение зависимостей для выбора одной версии. Это означает, что иногда ваши транзитивные зависимости получат другую версию, чем требуется, но есть способы управлять этим. Однако это ограничение исходит от Java, а не Maven, поскольку (как правило) в Java загрузчик классов будет предоставлять только одно определение класса, даже если в пути к классам найдено несколько определений. Поскольку Java не очень хорошо справляется с этим, Maven пытается избежать этого сценария в первую очередь.

Примечание: с npm v3 зависимости сглаживаются. Альтернативный менеджер пакетов yarn также делает то же самое.

Зрелость

Кроме того, Maven значительно старше NPM, имеет большую пользовательскую базу, огромное количество настраиваемых плагинов и до сих пор, вероятно, можно было бы считать более зрелым в целом. Иногда Maven используется для проектов, отличных от Java или даже полиглота, поскольку есть плагины для обработки других языков или определенных сред, таких как Android. Существуют плагины, которые соединяют Maven и другие инструменты сборки, такие как frontend-maven-plugin, который фактически обрабатывает несколько инструментов сборки JS.

Ответ 2

Ниже я использую | для разделения между maven | Термины npm соответственно:

Общие черты:

  • Оба инструмента поддерживают динамическое извлечение зависимостей (артефакты | пакеты) на основе файла дескриптора pom.xml | package.json, а также позволяют развернуть | опубликовать свои собственные артефакты | Пакеты.

  • У них обоих есть общедоступный репозиторий по умолчанию | реестр (http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org), но также можно использовать сторонние (через settings.xml | .npmrc).

  • Они оба поддерживают концепцию зависимостей уровня сборки (плагины | devDependencies, используемые в скриптах). * Maven также поддерживает зависимости provided, но это не относится к npm, поскольку javascript редко развертывается в контейнерах.

  • Они оба поддерживают пространство имен зависимостей: groupId | scope

Differrences:

  • У maven есть дополнительный локальный репозиторий(кеш):

    • Не нужно снова извлекать одну и ту же зависимость для разных проектов.
    • Артефакты, установленные локально, автоматически доступны для других локальных проектов.
  • зависимости от сборки проекта в maven загружаются в <homedir>/.m2. С помощью npm они загружаются в <projectdir>/node_modules.

  • Сборка в maven обычно представляет собой одностадийный процесс: mvn package (выборка, сборка). В npm это двухэтапный процесс: npm install (fetch deps), npm build (build)

  • maven определяет жизненные циклы сборки (для сборки, тестирования, развертывания) состоит из этапов, к которым присоединяются операции по умолчанию (цели подключаемых модулей), на основе различных параметров упаковки (.jar, .war, .ear и т.д.). Затем вы можете переписать эти операции или добавить новые (через систему плагинов). Это обеспечивает своего рода готовое решение для сборки, документации, тестирования, развертывания e.t.c. Подход npm более прост (см.: сценарии)

  • При настройке maven процесс сборки чаще всего включает редактирование pom.xml. В npm это включает в себя написание кода.

  • По какой-то причине диапазоны версий, определенные пользователями в модулях npm, намного свободны, чем в maven. Это может вызвать проблемы с транзитивными зависимостями, поэтому недавно был добавлен дополнительный файл: package-lock.json

  • С npm гораздо проще начать новый проект: npm init. С maven вам нужно знать, как написать минимальный pom.xml, или прочитать об архетипах.

  • В общем случае редактировать pom.xml гораздо чаще, чем package.json. Например. добавление зависимостей в maven выполняется вручную (или через IDE), а в npm - через командную строку.

  • Как и во всех инструментах сборки, вы можете вызывать один инструмент изнутри другого, но я думаю, что чаще вызывать npm изнутри maven, чем наоборот.

  • npm поддерживает dev, производственные сборки. В Maven это должно быть определено через профили.

Ответ 3

да. это аналогичный инструмент для упаковки Java. ищите gradle, который дает вам больше свободы с помощью groovy language, но для начала вы можете использовать maven для организации ваших зависимостей. вы включаете их в качестве тегов, и maven выполняет эту работу за вас.

он обходит дерево зависимостей и загружает все соответствующие банки.

Ответ 4

Да, то же самое с Gradle, но они не так удобны для пользователя, как npm.