Киби.ru

Живой сайт об актуальных проектах

User Tools

Site Tools


notes:java:maven

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
notes:java:maven [2018/12/14 16:07] – [Если вы не определяете никакой информации, откуда ваш POM унаследует её?] kibinotes:java:maven [2018/12/19 18:35] (current) kibi
Line 1: Line 1:
-====== Вопросы и ответы по Maven ======+====== Maven FAQ ======
  
 {{tag>maven java}} {{tag>maven java}}
 +
 +Основные ссылки по Maven:
 +
 +  * [[https://maven.apache.org/|Сайт проекта]]
 +  * [[https://mvnrepository.com/|Основной репозитарий Maven]]
 +
 +===== Что такое сборка проекта, автоматизация сборки? =====
 +
 +<wrap em>Сборка (англ. assembly)</wrap> - двоичный файл, содержащий исполняемый код программы или другой, подготовленный для использования информационный продукт. Сборка проекта - это в том числе процесс создания необходимого двоичного файла. 
 +
 +<wrap em>Автоматизация сборки</wrap> - этап написания скриптов или автоматизация широкого спектра задач применительно к ПО, применяемому разработчиками в их повседневной деятельности, включая такие действия, как:
 +  * Компиляция исходного кода в бинарный код
 +  * Сборка бинарного кода
 +  * Выполнение тестов
 +  * Разворачивание программы на производственной платформе
 +  * Написание сопроводительной документации или описание изменений новой версии
 +
 +===== Что такое Maven? Как он работает? =====
 +
 +[[https://maven.apache.org/|Apache Maven]] - это Java фреймворк для автоматизации сборки проектов, компиляции, создания jar, создания дистрибутива программы, генерации документации. 
 +
 +Если собирать большие проекты с командной строки, то команда для сборки будет очень длинной, поэтому её иногда записывают в bat/sh скрипт. Но такие скрипты зависят от платформы. Для того чтобы избавиться от этой зависимости и упростить написание скрипта, используют инструменты для сборки проекта.
 +
 +Maven обеспечивает декларативную, а не императивную сборку проекта. То есть, в файлах проекта ''pom.xml'' содержится его описание, а не отдельные команды. Все задачи по обработке файлов в Maven выполняется через плагины.
 +
 +===== Какие преимущества Maven? =====
 +
 +Основные преимущества Maven:
 +  * Независимость от ОС. Сборка проекта происходит в любой операционной системе. Файл проекта один и тот же.
 +  * Управление зависимостями. Редко какие проекты пишутся без использования сторонних библиотек(зависимостей). Эти сторонние библиотеки зачастую тоже в свою очередь используют библиотеки разных версий. Maven позволяет управлять такими сложными зависимостями. Это позволяет разрешать конфликты версий, и в случае необходимости, легко переходить на новые версии библиотек.
 +  * Возможна сборка из командной строки. Такое часто необходимо для автоматической сборки проекта на сервере ([[wp>Continuous Integration]]).
 +  * Хорошая интеграция со средами разработки. Основные среды разработки на java легко открывают проекты, которые собираются c помощью maven. При этом зачастую проект настраивать не нужно: он сразу готов к дальнейшей разработке. 
 +  * Как следствие, если с проектом работают в разных средах разработки, то maven удобный способ хранения настроек. Настроечный файл среды разработки и для сборки один и тот же - меньше дублирования данных и, соответственно, ошибок.
 +  * Декларативное описание проекта. Указано **что, где и когда** надо сделать, а не **как** надо сделать.
 +
 +===== Какие недостатки Maven? =====
 +
 +Недостатки Maven:
 +  * Неочевидность. Если в [[https://ant.apache.org/|Apache Ant]] указывается команда на удаление, и удаляется файл, то в случае Maven надо всем сердцем [[https://stackoverflow.com/questions/48949025/how-to-delete-a-folder-at-maven-clean-phase|довериться плагину]] и документации по нему.
 +  * При таком объёме необходимых знаний документации не так много, особенно по каким-то специальным моментам. Да и просто читать придётся много. Порог вхождения, если потребуется собирать даже не самое сложное приложение куда выше, чем у Ant.
 +  * Если нужно найти какой-то специальный плагин - это будет сделать непросто, плагинов много. И не факт, что найденный подойдёт на все 100% и будет работать без ошибок.
 +  * Нужен доступ в интернет (или придётся разворачивать собственный репозитарий, что трудоёмко)
 +  * Большие трудности, если проект не типовой.
 +
 +===== Какими аспектами управляет Maven? =====
 +
 +Вот основные аспекты, которыми позволяет управлять Maven:
 +  * Создание (Build)
 +  * Документирование (Documentation)
 +  * Отчёты (Reporting)
 +  * Зависимости (Dependencies)
 +  * Релизы (Releases)
 +  * Системы контроля версий (SCM)
 +  * Список рассылки (Mailing list)
 +  * Дистрибьюция (Distribution)
 +
 +===== Как узнать, какую версию Maven вы используете? =====
 +
 +Версию можно узнать с помощью следующей команды:
 +<code bash>mvn --version</code>
 +
 +===== Для чего был создан Maven? =====
 +
 +Основной целью Maven является предоставление разработчику:
 +  * Понятной модели для проектов, которая может быть использована повторно и была бы проста в поддержании.
 +  * Плагинов, которые могут взаимодействовать с этой моделью.
 +
 +Структура и содержание проекта Maven указывается в специальном xml-файле, который назывется <wrap em>Project Object Model</wrap> (POM), который является базовым модулем всей системы.
 +
 +===== Какая структура каталогов в Maven? =====
 +
 +В Maven [[https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html|стандартная структура каталогов]], благодаря ей отпадает необходимость прописывать пути к файлам проекта. В корневом каталоге проекта находится ''pom.xml'' и несколько текстовых файлов. Всё остальное хозяйство аккуратно разложено в подкаталогах. Главные из них - **src** и **target**. Однако, порядок сохраняется и вглубь:
 +
 +| ''src/main/java'' | Application/Library sources | исходный код приложения или библиотеки |
 +| ''src/main/resources'' | Application/Library resources | ресурсы приложения или библиотеки |
 +| ''src/main/filters'' | Resource filter files | файлы с параметрами фильтрации ресурсов |
 +| ''src/main/webapp'' | Web application sources | исходный код веб-приложения |
 +| ''src/test/java'' | Test sources | исходный код тестов (юнит-тестов) |
 +| ''src/test/resources'' | Test resources | ресурсы юнит тестов |
 +| ''src/test/filters'' | Test resource filter files | файлы с параметрами фильтрации ресурсов для тестов |
 +| ''src/it'' | Integration Tests (primarily for plugins) | интеграционные тесты (в основном для плагинов) |
 +| ''src/assembly'' | Assembly descriptors | дескрипторы сборки |
 +| ''src/site'' | Site | вебсайт приложения (документация) |
 +| ''LICENSE.txt'' | Project's license | лицензионное соглашение проекта |
 +| ''NOTICE.txt'' | Notices and attributions required by libraries that the project depends on| замечания и необходимые атрибуты библиотек, от зависит проект |
 +| ''README.txt'' | Project's readme | краткое описание проекта |
 +
 +===== Где хранятся файлы классов при компиляции проекта Maven? =====
 +
 +Файлы классов хранятся в: ''${basedir}/target/classes/''.
 +
 +===== Что такое pom.xml? =====
 +
 +''pom.xml'' - это XML-файл, который содержит информацию о конфигурации и деталях проекта, используемых при создании проекта на Maven. Он всегда находится в базовом каталоге проекта. Этот файл также содержит описание задач, список и параметры плагинов. 
 +
 +Во время выполнения задач, Maven ищет файл ''pom.xml'' в базовой директории проекта. Он читает его и получает необходимую информацию, после чего выполняет задачи.
 +
 +Корневой элемент ''<project>'' содержит ссылку на схему XML, которая облегчает редактирование и проверку ''pom.xml'': 
 +
 +<code xml><project xmlns="http://maven.apache.org/POM/4.0.0"
 +  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 +  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"></code> 
 +
 +Внутри тега ''project'' содержится основная и обязательная информация о проекте.
 +
 +===== Какую информацию содержит pom.xml? =====
 +
 +Среди информации которую содержит pom.xml, мы можем выделить следующие блоки:
 +  * Зависимости проекта (project dependencies)
 +  * Плагины (plugins)
 +  * Задачи/цели (goals)
 +  * Профиль создания (build profiles)
 +  * Версия проекта (project version)
 +  * Разработчики (developers)
 +  * Список рассылки (mailing list)
 +
 +===== Что такое супер POM? =====
 +
 +Все POM-файлы являются наследниками родительского ''pom.xml''. Этот POM-файл называется <wrap em>Super POM</wrap> и содержит значения, унаследованные по умолчанию.
 +
 +===== Какие элементы необходимы для минимального POM? =====
 +
 +Обязательные элементы для минимального POM это корневой элемент, ''modelVersion'', ''GroupID'', ''artifactID'' и версия. Минимальный POM файл:
 +<code xml>
 +<project>
 +  <modelVersion>4.0.0</modelVersion>
 +  <groupId>org.codehaus.mojo</groupId>
 +  <artifactId>my-project</artifactId>
 +  <version>1.0</version>
 +</project>
 +</code>
 +
 +===== Что такое зависимости в Maven? =====
 +
 +<wrap em>Зависимость (dependency)</wrap> - это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования.
 +
 +===== Что такое артефакт в Maven? =====
 +
 +<wrap em>Артефакт (artefact)</wrap> - это, по сути, любая библиотека, хранящаяся в репозитарии (месте хранения). Это может быть какая-то зависимость или плагин. Обычно артефактом является JAR-файл, который хранится в репозитарии Maven. Каждый артефакт содержит ''group ID'', ''artifact ID'' и версию.
 +
 +===== Что такое плагин в Maven? =====
 +
 +<wrap em>Плагин (plugin)</wrap> - это зависимости Maven'а, расширяющие его функционал.
 +
 +===== Что такое задача в Maven? =====
 +
 +<wrap em>Задача (goal)</wrap> - это специальная задача, которая относится к сборке проекта и его управлению. Она может привязываться как к нескольким фазам, так и ни к одной. Задача, которая не привязана ни к одной фазе, может быть запущена вне фаз сборки с помощью прямого вызова.
 +
 +===== Что такое архетип в Maven? =====
 +
 +<wrap em>Архетип (archetype)</wrap> - это некая стандартная компоновка файлов и каталогов в проектах различного рода (веб, swing-проекты и прочие). Другими словами, Maven знает, как обычно строятся проекты и в соответствии с архетипом создает структуру каталогов.
 +
 +===== Что такое репозитарий в Maven? =====
 +
 +<wrap em>репозитарий (repository)</wrap> - глобальное хранилище всех библиотек, доступных для Maven, это место где хранятся артефакты: jar файлы, pom-файлы, javadoc, исходники, плагины.
 +
 +===== Какие типы репозитария существуют в Maven? =====
 +
 +В Maven существуют три типа репозитариев:
 +  * **Локальный (local) репозитарий** - это директория, которая хранится на нашем компьютере. Она создаётся в момент первого выполнения любой команды Maven. По умолчанию она расположена в <home директория>/.m2/repository - персональная для каждого пользователя. Фактически она является кэшем для центрального и удалённого репозитариев.
 +  * **Центральный (central) репозитарий** - это репозитарий, который обеспечивается сообществом Maven. Он содержит огромное количество часто используемых библиотек. Расположен по адресу http://repo1.maven.org/maven2/ и доступен на чтение для всех пользователей в интернете. Если Maven не может найти зависимости в локальном репозитарии, то автоматически начинается поиск необходимых файлов в центральном репозитарии. Для поиска по центральному репозитарию можно использовать сайт https://mvnrepository.com/
 +  * **Удалённый (remote) репозитарий**. Иногда Maven не может найти необходимые зависимости в центральном репозитарии, например при отсутствии интернета. В этом случае процесс сборки прерывается, и в консоль выводится сообщение об ошибке. Для того, чтобы предотвратить подобную ситуацию, в Maven предусмотрен механизм **удалённого репозитария**, который является репозитарием, определённым самим разработчиком. Там могут храниться все необходимые зависимости.
 +
 +===== Какая команда устанавливает JAR-файл в локальное хранилище (репозитарий)? =====
 +
 +<code bash>mvn install</code>
 +
 +===== Какой порядок поиска зависимостей Maven? =====
 +
 +Когда мы выполняем собрку проекта в Maven, автоматически начинается поиск необходимых зависимостей в следующем порядке:
 +  - Поиск зависимостей в локальном репозитарии. Если зависимости не обнаружены, происходит переход к шагу 2.
 +  - Поиск зависимостей в центральном репозитарии. Если они не обнаружены и удалённый репозитарий определён, то происходит переход к шагу 4.
 +  - Если удалённый репозитарий не определён, то процесс сборки прекращается и выводится сообщение об ошибке.
 +  - Поиск зависимостей на удалённом репозитарии, если они найдены, то происходит их загрузка в локальный репозитарий, если нет - выводится сообщение об ошибке.
 +
 +===== Какие два файла настройки есть в Maven, как они называются и где расположены? =====
 +
 +В Maven, файлы настройки называются ''settings.xml'', и они расположены в двух местах:
 +  * каталог где установлен Maven: ''$M2_Home/conf/settings.xml''
 +  * домашняя директория пользователя: ''${user.home}/.m2/settings.xml''
 +
 +===== Что такое жизненный цикл сборки в Maven? =====
 +
 +<wrap em>Жизненный цикл сборки (Lifecycle)</wrap> - это чётко определённая последовательность фаз, во время выполнения которых должны быть достигнуты определённые цели. Здесь фаза представляет собой стадию жизненного цикла.
 +
 +===== Назовите основные фазы жизненного цикла сборки Maven? =====
 +
 +Когда Maven начинает сборку проекта, он проходит через определённую последовательность фаз сборки, и выполняет определенные задачи, которые указаны в каждой из фаз.
 +
 +В Maven есть следующие три стандартных жизненных цикла:
 +  * **Очистка (clean)** - очищает артефакты, созданные до сборки.
 +  * **Сборка (default or build)** - используется для создания приложения.
 +  * **Создание сайта проекта (site)** - генерирует документацию сайта для проекта.
 +
 +===== Что делает команда mvn site? =====
 +
 +<code bash>mvn site</code> создает веб-сайт проекта.
 +
 +===== Что делает команда mvn clean? =====
 +
 +<code bash>mvn clean</code> эта команда очищает целевую директорию от созданных в процессе сборки файлов.
  
 ===== Из каких фаз состоит жизненный цикл сборки Clean? ===== ===== Из каких фаз состоит жизненный цикл сборки Clean? =====
Line 32: Line 233:
   * **post-integration-test** - выполняет действия, необходимые  после выполнения интеграционных тестов. Например, освобождение ресурсов.   * **post-integration-test** - выполняет действия, необходимые  после выполнения интеграционных тестов. Например, освобождение ресурсов.
   * **verify** - выполняет любые проверки для подтверждения того, что пакет пригоден и отвечает критериям качества.   * **verify** - выполняет любые проверки для подтверждения того, что пакет пригоден и отвечает критериям качества.
-  * **install** - переносит пакет в локальный репозиторий, откуда он будет доступен для использования как зависимость в других проектах. +  * **install** - переносит пакет в локальный репозитарий, откуда он будет доступен для использования как зависимость в других проектах. 
-  * **deploy** - копирует финальный пакет (архив) в удалённый репозиторий для, того, чтобы сделать его доступным другим разработчикам и проектам.+  * **deploy** - копирует финальный пакет (архив) в удалённый репозитарий для, того, чтобы сделать его доступным другим разработчикам и проектам.
  
 Здесь также необходимо уточнить два момента: Здесь также необходимо уточнить два момента:
Line 53: Line 254:
 <code bash>mvn clean dependency:copy-dependencies package</code>  <code bash>mvn clean dependency:copy-dependencies package</code> 
  
-Аргументы ''clean'' и ''package'' являются фазами сборки до тех пор, пока "''dependency:copy-dependencies''" является задачей. В этом случае, сначала будет выполнена фаза clean, после этого будет выполнена задача "''dependency:copy-dependencies''". После чего будет выполнена фаза ''package''.+Аргументы ''clean'' и ''package'' являются фазами сборки, в то время как "''dependency:copy-dependencies''" является задачей.  
 + 
 +В этом случае, сначала будет выполнена фаза clean, после этого будет выполнена задача "''dependency:copy-dependencies''". После чего будет выполнена фаза ''package''.
  
 ===== Что такое профиль сборки (Build Profile)? ===== ===== Что такое профиль сборки (Build Profile)? =====
Line 97: Line 300:
 ===== Когда Maven использует внешние зависимости? ===== ===== Когда Maven использует внешние зависимости? =====
  
-Если необходимые файлы не найдены ни в центральном, ни на удалённом репозитории, тогда для решения этой проблемы используются внешние зависимости.+Если необходимые файлы не найдены ни в центральном, ни на удалённом репозитарии, тогда для решения этой проблемы используются внешние зависимости.
  
 ===== Что нужно определить для внешней зависимости? ===== ===== Что нужно определить для внешней зависимости? =====
Line 114: Line 317:
 ===== Что такое SNAPSHOT в Maven? ===== ===== Что такое SNAPSHOT в Maven? =====
  
-<wrap em>SNAPSHOT</wrap> - это специальная версия, которая показывает текущую рабочую копию. При каждой сборке Maven проверяет наличие новой **snapshot** версии на удалённом репозитории.+<wrap em>SNAPSHOT</wrap> - это специальная версия, которая показывает текущую рабочую копию. При каждой сборке Maven проверяет наличие новой **snapshot** версии на удалённом репозитарии.
  
 ===== В чем разница между snapshot и версией? ===== ===== В чем разница между snapshot и версией? =====
  
-В случае с **обычной версией**, если Maven однажды загрузил версию ''data-service:1.0'', то он больше не будет пытаться загрузить новую версию 1.0 из репозитория. Для того, чтобы скачать обновлённый продукт ''data-service'' должен быть обновлён до версии 1.1.+В случае с **обычной версией**, если Maven однажды загрузил версию ''data-service:1.0'', то он больше не будет пытаться загрузить новую версию 1.0 из репозитария. Для того, чтобы скачать обновлённый продукт ''data-service'' должен быть обновлён до версии 1.1.
  
 В случае со **snapshot**, Maven автоматически будет подтягивать крайний snapshot (''data-service:1.0-SNAPSHOT'') каждый раз, когда будет выполнятся сборка проекта. В случае со **snapshot**, Maven автоматически будет подтягивать крайний snapshot (''data-service:1.0-SNAPSHOT'') каждый раз, когда будет выполнятся сборка проекта.
Line 137: Line 340:
   * **runtime** - эта область указывает на то, что зависимость не обязательна для ''compilation'', но для фаз выполнения.    * **runtime** - эта область указывает на то, что зависимость не обязательна для ''compilation'', но для фаз выполнения. 
   * **test** - эта область указывает, что зависимость не обязательна для нормального использования приложения.   * **test** - эта область указывает, что зависимость не обязательна для нормального использования приложения.
-  * **system** - эта область похожа на ''provided'' за исключением того, что вы предоставляете JAR. Артефакт всегда доступен и не смотрит в репозиторий.+  * **system** - эта область похожа на ''provided'' за исключением того, что вы предоставляете JAR. Артефакт всегда доступен и не смотрит в репозитарий.
   * **import** - эта область используется в зависимости типа ''pom'' в ''<dependencyManagement>'' разделе. Это указывает на то, что определенный POM будет заменен зависимостями в этом POM ''<dependencyManagement>'' разделе.   * **import** - эта область используется в зависимости типа ''pom'' в ''<dependencyManagement>'' разделе. Это указывает на то, что определенный POM будет заменен зависимостями в этом POM ''<dependencyManagement>'' разделе.
  
Line 171: Line 374:
 ===== При сборке проекта Maven постоянно проверяет наличие обновлений в интернете. Можете ли вы собрать проект без интернета? ===== ===== При сборке проекта Maven постоянно проверяет наличие обновлений в интернете. Можете ли вы собрать проект без интернета? =====
  
-Да, можете, если в вашем локальном репозитории есть все необходимые для сборки артефакты.+Да, можете, если в вашем локальном репозитарии есть все необходимые для сборки артефакты.
  
 ===== Если при сборке проекта в тестах произошла ошибка, как собрать проект без запуска тестов? ===== ===== Если при сборке проекта в тестах произошла ошибка, как собрать проект без запуска тестов? =====
Line 200: Line 403:
   * **description** - элемент представляет собой общее описание проекта. Это часто используется в генерации документации Maven   * **description** - элемент представляет собой общее описание проекта. Это часто используется в генерации документации Maven
   * **url** - интернет-страница проекта   * **url** - интернет-страница проекта
-  * **repositories** - репозитории для артефактов +  * **repositories** - репозитарии для артефактов 
-  * **pluginRepositories** - репозитории для плагинов Maven+  * **pluginRepositories** - репозитарии для плагинов Maven 
 + 
 +<note>Эта страница содержит переработанные и откорректированные материалы с  [[https://jsehelper.blogspot.com/2016/05/maven-1.html]]</note>
  
 ===== См. также ===== ===== См. также =====
  
 {{backlinks>.}} {{backlinks>.}}
notes/java/maven.1544792825.txt.gz · Last modified: 2018/12/14 16:07 by kibi

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki