mvn clean install что это
Apache Maven — основы
После публикации топика о Maven в комментариях возникли вопросы о том, как начать с ним работать, с чего начать, как составлять файлы pom.xml, откуда брать плагины и т.п. Данный топик будет своего рода getting started или f.a.q.
Терминология
Как в любой системе, в Maven, есть свой набор терминов и понятий.
Вся структура проекта описывается в файле pom.xml (POM – Project Object Model), который должен находиться в корневой папке проекта. Ключевым понятием Maven является артефакт — это, по сути, любая библиотека, хранящаяся в репозитории. Это может быть какая-то зависимость или плагин.
Зависимости — это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования.
Плагины же используются самим Maven’ом при сборке проекта или для каких-то других целей (деплоймент, создание файлов проекта для Eclipse и др.).
В самом начале работы с Maven, пользователь непременно столкнется с таким понятием как архетип. Архетип — это некая стандартная компоновка файлов и каталогов в проектах различного рода (веб, swing-проекты и прочие). Другими словами, Maven знает, как обычно строятся проекты и в соответствии с архетипом создает структуру каталогов.
Как правило, название артефакта состоит из названия группы, собственного названия и версии. К примеру Spring будет иметь вот такое название в среде Maven: org.springframework.spring:2.5.5. Последний домен означает всегда artifactId, все, что перед ним – groupId – хорошо это запомните!
На жизненном цикле останавливаться не буду, так как он хорошо описан в вышеобозначенной статье. А теперь перейдем к практике.
Установка Maven
Последнюю версию всегда можно скачать на странице загрузки на официальном сайте. Просто распаковываем архив в любую директорию. Далее необходимо создать переменную в Path, в которой необходимо указать путь к Maven. Заходим в Win + Pause – Дополнительно – Переменные среды – в верхнем окошке нажимаем Создать, вводим имя M2_HOME и значение допустим “C:\apache-maven-2.2.1”. Далее там же создаем еще одну переменную M2 со значением %M2_HOME%\bin. Так же убеждаемся, что есть переменная JAVA_HOME с путем к JDK. Ее значение должно быть примерно таким «c:\Program Files\Java\jdk1.6.0_10\». И наконец в том же окошке создаем/модифицируем переменную Path, в нее необходимо просто написать %M2%, чтобы наша папочка с исполняемым файлом Maven была видна из командной строки. Теперь необходимо проверить работоспособность нашей установки. Для этого заходим в командную строку и вводим команду
Должна появиться информация о версиях Maven, jre и операционной системе, что-то вроде:
Maven создаст вам локальный репозиторий в вашей личной папке, например в каталоге C:\Documents and Settings\username\.m2\repository
Все, Maven готов к работе, можно приступать к созданию приложения.
Создание приложения из архетипа
На сайте Maven перечислены наиболее популярные архетипы для приложений, но вы можете легко создать свой или найти более специфичный например здесь.
Итак, допустим нас интересует веб-приложение – находим подходящий архетип, называется он maven-archetype-webapp. В командной строке, в необходимом каталоге выполняем команду Maven:
Теперь мы можем лицезреть довольно наглядную структуру каталогов с говорящими названиями java – здесь будут ваши классы, webapp – здесь размещаются странички веб-приложения, resources – различного рода ресурсы в classpath (файлы конфигурации, например), test – юнит-тесты, соответственно и т.п.
Сборка проекта
Здесь все просто – выполняем команду
в корневом каталоге приложения, там, где находится файл pom.xml. Первая команда скомпилирует ваш проект и поместит его в папку target, а вторая еще и положит его к вам в локальный репозиторий.
Есть полезная функция, наподобие конвеера, то есть можно написать
и Maven сначала очистит папку target проекта, потом соберет его и положит в репозиторий.
Минимальный набор действий для работы Maven мы изучили, теперь переходим к кастомизации и добавлению зависимостей проекта.
Зависимости и репозитории
Как правило, большинство популярных библиотек находятся в центральном репозитории, поэтому их можно прописывать сразу в раздел dependencies вашего pom-файла. Например чтобы подключить Spring Framework необходимо определить следующую зависимость:
Версию хотя и можно не указывать и тогда Maven возьмет последний вариант, но я вам лично советую это делать, потому как у нас неоднократно бывали случаи, что проект просто в один момент переставал собираться или начинал падать в совершенно неожиданных и хорошо оттестированных местах, хотя вроде бы никто ничего не менял.
Специфические вещи обычно не находятся в центральном репозитории и тогда вам придется указать репозиторий производителя вручную. Для примера добавим зависимость JSF-фреймворка ajax-компонентов JBoss RichFaces.
С зависимостями все просто:
А вот репозиторий JBoss теперь необходимо прописать ручками либо в файле settings.xml, который лежит в корне вашего локального репозитория, либо в самом файле pom.xml, в зависимости от того, нужен ли данный репозиторий во всех проектах, либо в каком-то одном конкретном, соответственно:
Как правило на сайтах крупных проектов пишут всю информацию, необходимую для встраивания их библиотеки в проект на основе Maven, но бывают случаи, когда артефакт приходится искать очень и очень долго. Здесь нам очень сильно может помочь MVNrepository.com — он вам всегда подскажет где может находиться искомая библиотечка. Но если уж и там не нашлось, то из собственного опыта могу посоветовать гуглить « pom.xml». Бывает так, что проекты уже давно закрыты и в репозитории не положены потому что разработчики уже не заботятся об их распространении. Тогда остается один единственный способ – добавить файл в репозиторий вручную командой:
Последний параметр чаще всего имеет значение jar.
Плагины
Так как плагины являются такими же артефактами, как и зависимости, то они описываются практически так же. Вместо раздела dependencies – plugins, dependency – plugin, repositories – pluginRepositories, repository – pluginRepository.
Плагинами Maven делает все, даже непосредственно то, для чего он затевался – сборку проекта, только этот плагин необязательно указывать в свойствах проекта, если вы не хотите добавить какие-то фичи.
Посмотрим как настроить плагин для создания проекта для Eclipse с использованием WTP ver. 2.0. В раздел plugins нашего pom.xml прописываем следующий плагин:
Теперь идем опять таки в командную строку и выполняем команду
Ждем пока Maven найдет все библиотеки в репозитории или скачает их и вуаля – теперь наш Maven-проект можно открыть как проект eclipse. При этом библиотеки никуда не копируются как при классическом подходе, а остаются в репозитории и Eclipse делает на них ссылку через свои переменные.
Единого списка всех плагинов естественно не существует, на официальном сайте только есть поддерживаемые плагины непосредственно разработчиками Maven. Однако хотелось бы отметить, что названия плагинов довольно прямолинейны и сделав поиск по ключевым словам «maven tomcat plugin» вы скорее всего обнаружите первой ссылкой плагин для деплоймента проекта в Tomcat.
Собственный репозиторий
К сожалению сам не имею большого опыта настройки репозитория, но могу посоветовать как наиболее простой и распространенный Nexus. За дополнительной информацией следует обратиться на сайт данного проекта.
Однако нельзя оставить без внимания и достойных конкурентов в лице Artifactory и Archiva.
You can use this guide to understand what a ‘mvn clean install’ really does. Also: A crash-course on Maven and workarounds for its most common pitfalls.
What does mvn clean install do?
The short answer
mvn clean install is the command to do just that.
You are calling the mvn executable, which means you need Maven installed on your machine. (see How do you install Maven?)
The (short) long answer:
There is more to Maven than a couple lines on ‘mvn clean install’. If you want to learn about how Maven’s dependency management and build cycle works, or how to avoid the most common pitfalls when working with it: Read on.
Maven: Crash-Course
Maven is one of the most popular build tools in the Java universe (others being Gradle or old-school Ant). You can not only build Java projects with it, but pretty much every project written in a JVM language like Kotlin or Scala, as well as other languages like C# and Ruby.
Now what exactly does a build tool do? Maven does three things rather well:
Dependency Management: Maven lets you easily include 3rd party dependencies (think libraries/frameworks such as Spring) in your project. An equivalent in other languages would be Javascript’s npm, Ruby’s gems or PHP’s composer.
Everything Java: Maven can also run code quality checks, execute test cases and even deploy applications to remote servers, through plugins. Pretty much every possible task you can think of.
Maven’s directory layout
Maven’s pom.xml
Technically, any directory that contains a pom.xml file is also a valid Maven project. A pom.xml file contains everything needed to describe your Java project. Let’s have a look at a minimal version:
We are defining a project called ‘my-project’
With a version number of 1.0-SNAPSHOT, i.e. work-in-progress
Using Java 1.8 for compilation
With one dependency needed for unit testing: junit in version 4.12
Maven’s src & target folders
Java source code is to be meant to live in the «/src/main/java» folder
Maven will put compiled Java classes into the «target/classes» folder
In the end, your project will look like this:
Now that you have a pom.xml file, as well as a src folder, you still need Maven installed on your machine. Let’s do that now.
The Confident Maven Professional
If you want to easily get a deep and practical understanding of working with Maven professionally: I have written a course for you.
Interested in trying out the full first module?
How do you install Maven?
Now you need to make sure to add the /bin directory to your PATH variable, otherwise you cannot call ‘mvn’ (think: mvn clean install) from anywhere. That’s it.
If you are unsure about any of these two steps, there’s a great video on Youtube, showing how to install the latest Maven 3.6 on Windows.
A look at the Maven build lifecycle: phases
Now what really happens when you execute a mvn clean install in your project? Maven has the concept of a build lifecycle, which is made up of different phases.
Here’s what Maven’s default lifecycle looks like (note: it is missing ‘clean’).
These phases are sequential and depend on each other.
Example:
Where does Maven store 3rd party libraries?
Contrary to other languages, where project dependencies are stored in your project’s directory, Maven has the concept of repositories.
There are local repositories (in your user’s home directory:
/.m2/) and remote repositories. Remote repositories could be internal, company-wide repositories like Artifactory or Nexus or the (reference) global repo at https://repo.maven.apache.org/maven2/.
Maven will always download your project dependencies into your local maven repository first and then reference them for your build. When you think back at your pom.xml file from before:
Then mvn will, once you try and «mvn test» your project, download the junit dependency into
/.m2/repository/junit/junit/4.12/junit-4.12.jar and reference it via Java’s classpath mechanism for your build.
Введение в Maven от Balaji Varnasi и Sudha Belida (перевод)
От переводчика: Несколько лет назад я поставил себе целью быстро, но достаточно плотно познакомиться с таким повсеместно используемым фреймворком, как Apache Maven. Практически моментально мне удалось найти соответствующую литературу, но я был слегка удивлен тем фактом, что все комплексные материалы были исключительно на английском языке, на русском же была масса разрозненных статей, но полноценной книжки, которую можно было прочитать от корки до корки, мне обнаружить не удалось. Как результат, для прочтения я выбрал небольшую книжку «Introducing Maven», написанную Balaji Varnasi и Sudha Belida и выпущенную издательством Apress в 2014 году. По мере прорешивания всех задач у меня постепенно родился перевод этого издания, который хоть и пару лет пролежал у меня в столе, но возможно всё еще будет полезен сообществу.
Здесь я привожу перевод только одной из глав этой книги, а целиком её можно скачать вот по этим ссылкам на английском, или на русском языке (PDF).
Глава 6: Архетипы Maven
До этого момента вы создавали проект Maven вручную, создавая папки и файлы pom.xml с нуля. Это может быть утомительным, особенно если вам часто приходится создавать проекты. Для решения этой проблемы Maven предоставляет архетипы. Архетипы Maven — это заготовки проектов, которые позволяют пользователям легко создавать новые проекты.
Архетипы Maven также предоставляют удобную базу для обмена опытом и обеспечивают постоянство стандартной структуры директорий Maven. Например, предприятие может создать архетип с корпоративной каскадной таблицей стилей (CSS), утвержденными библиотеками JavaScript и повторно используемыми компонентами. Разработчики, используя эти архетипы для создания проектов, будут автоматически следовать стандартам компании.
Встроенные архетипы
Maven прямо «из коробки» предоставляет разработчикам сотни архетипов. Кроме того, существует множество проектов с открытым исходным кодом предоставляющих дополнительные архетипы, которые можно скачать и использовать. Maven также предоставляет архетипы плагинов с целями для создания архетипов и генерации проектов из архетипов.
У плагина архетипов существует цель generate, позволяющая просматривать и выбирать необходимый архетип. Листинг 6-1 отображает результаты запуска цели generate из командной строки. Как видите, на выбор предоставлен 491 архетип (на 2018 год их уже было более 2 тысяч – прим.перев.). Использование нескольких из них рассматривается в этой главе.
Листинг 6-1. Вызов цели generate плагина архетипов Maven
Создание Веб-проекта
Maven предоставляет архетип maven-archetype-webapp, позволяющий сгенерировать веб-приложение. Давайте создадим такое приложение путем вызова следующей команды в папке C:\apress\gswm-book\chapter6:
Эта команда выполняется в интерактивном режиме. На поступающие вопросы введите следующую информацию:
Сгенерированная структура папок должна походить на ту, что изображена на Рисунке 6-1:
Рисунок 6-1. Структура веб-проекта Maven
Файл pom.xml минимален и содержит единственную зависимость — JUnit. Maven может упростить запуск вашего веб-приложения, используя встроенные веб-серверы, такие как Tomcat или Jetty. Листинг 6-2 отображает модифицированный файл pom.xml с добавленным плагином Tomcat.
Листинг 6-2. Модифицированный файл pom.xml с внедренным плагином Tomcat
Для того, чтобы запустить это веб-приложение на сервере Tomcat вызовите следующую команду в корневой директории проекта:
Вы увидите развернутый проект и вывод, похожий на изображенный на Листинге 6-3.
Листинг 6-3. Вывод команды Tomcat run
Теперь запустите браузер и перейдите по адресу localhost:8080/gswm-web/. Вы должны увидеть веб-страницу, подобную изображенной на Рисунке 6-2.
Рисунок 6-2. Веб-проект, запущенный в браузере
Мультимодульный проект
Проекты Java Enterpise Edition (JEE) часто разделяются на несколько модулей для облегчения разработки и поддержки. Каждый из этих модулей производит такие артефакты, как Enterprise JavaBeans (EJBs), веб-сервисы, веб-проекты и клиентские JAR. Maven поддерживает разработку таких больших JEE-проектов, позволяя размещать несколько Maven-проектов внутри другого Maven-проекта. Структура такого мультимодульного проекта отображена на Рисунке 6-3. Родительский проект обладает файлом pom.xml и несколькими Maven-проектами внутри.
Рисунок 6-3. Структура мультимодульного проекта
До конца этой главы мы объясним, как построить мультимодульный проект для задачи, в которой вам нужно разделить большой проект на веб-приложение (WAR-артефакт), предоставляющее пользовательский интерфейс, сервисный проект (JAR-артефакт), содержащий код сервисного слоя, и проект постоянства (Persistence), содержащий код уровня репозитория. На Рисунке 6-4 отображено визуальное представление такого сценария.
Рисунок 6-4. Мультимодульный проект Maven
Давайте начнём процесс с создания родительского проекта. Чтобы это сделать выполните следующую команду в командной строке в папке C:\apress\gswm-book\chapter6:
Архетип pom-root создает папку gswm-parent и в ней — файл pom.xml.
Как следует из Листинга 6-4, созданный файл pom.xml имеет минимальное содержимое. Заметьте, что в теге packaging родительского проекта указан тип pom.
Листинг 6-4. Родительский файл pom.xml
Теперь создайте веб-проект запуском следующей команды в папке C:\apress\gswm-book\chapter6\gswm-parent:
В процессе генерации этого веб-проекта вы предоставили Maven такие координаты, как groupId, version и др. в виде параметров, переданные в генерирующую цель, которая и создала проект gswm-web.
Следующим шагом будет создание сервисного проекта. Находясь в папке C:\apress\gswm-book\chapter6\gswm-parent выполните следующую команду:
Обратите внимание, что вы не указывали параметр package, т.к. maven-archetype-quickstart создает JAR-проект по умолчанию. Также обратите внимание на использование параметра interactiveMode. Он просто указывает Maven выполнять команду, не запрашивая у пользователя никакой информации.
Аналогично предыдущему шагу, создайте следующий Java-проект gswm-repository путем выполнения в папке C:\apress\gswm-book\chapter6\gswm-parent следующей команды:
Теперь, когда у вас сгенерированы все проекты, взгляните на файл pom.xml в папке gswm-parent. Листинг 6-5 отображает его содержимое.
Listing 6-5. Родительской файл pom.xml с модулями
Элемент modules позволяет объявлять дочерние модули в мультимодульном проекте. По мере генерации каждого модуля Maven регистрирует их в качестве дочерних. Кроме того, он модифицирует файлы pom.xml самих модулей, добавляя в них информацию о родительском pom.xml. Листинг 6-6 отображает файл pom.xml проекта gswm-web, в котором указан родительский pom-элемент.
Listing 6-6. Файл pom.xml веб-модуля
Теперь, когда вся инфраструктура установлена, можно собрать следующий проект. Просто запустите команду mvn package находясь в папке gswm-project, как отображено в Листинге 6-7.
Listing 6-7. Команда Maven package, запущенная в директории родительского проекта
Создание архетипов
Maven предоставляет несколько способов создать новый архетип. Здесь для этого мы будем использовать уже существующий проект.
Начнем с создания прототипного проекта, который будет использоваться в качестве основы для генерации архетипа. Этот проект будет Servlet 3.0-совместимым и содержит Status Servlet, возвращающий код 200 HTTP-состояния («OK» – успешный запрос). Вместо создания веб-проекта «с нуля» скопируем ранее сгенерированный проект gswm-web и создадим gswm-web-prototype в папке C:\apress\gswm-book\chapter6. Внесите следующие изменения в только что скопированный проект:
1. Удалите все прочие ресурсы, такие как файлы, специфичные для Integrated Development Environment (IDE) (.project, .classpath и т.д.), которые вы не хотите включать в архетип.
2. Замените содержимое файла web.xml из папки webapp/WEB-INF. Это настроит веб-приложение на использование Servlet 3.0:
3. Добавьте зависимость Servlet 3.0 в файл pom.xml. Обновленное содержимое pom.xml отображено в Листинге 6-8.
Листинг 6-8. Файл pom.xml с Servlet Dependency
4. Т.к. мы будем вести разработку веб-проекта на Java, то создайте папку с именем java в директории src/main. Аналогично создайте папки test/java и test/resources в директории src.
5. Создайте файл AppStatusServlet.java, принадлежащий пакету com.apress.gswmbook.web.servlet в директории src/main/java. Пакет com.apress.gswmbook.web.servlet преобразуется в структуру папок com\apress\gswmbook\web\servlet. Исходный код файла AppStatusServelet.java отображен в Листинге 6-9.
Listing 6-9. Исходный код Java-класса AppStatusServlet
Прототипный проект по структуре будет поход на изображенный на Рис.6-5.
Рис. 6-5. Сгенерированный прототипный проект
Используя командную строку, перейдите в папку gswm-web-prototype проекта из выполните следующую команду:
По завершению команды вы увидите сообщение Archetype created in target/generated-sources/archetype. Сгенерированный архетип находится в папке gswm-web-prototype/target/generated-sources/archetype.
Следующим шагом является перенос только что сгенерированного артефакта в отдельную папку gswm-web-archetype для его настройки перед публикацией. Для этого выполните следующие шаги:
1. Создайте папку gswm-web-archetype в директории C:\apress\gswm-book\chapter6.
2. Скопируйте поддиректории и файлы из папки C:\apress\gswm-book\chapter6\gswm-web-prototype\target\generated-sources\archetype в папку gswm-web-archetype.
3. Удалите поддиректорию target из папки C:\apress\gswm-book\chapter6\gswm-web-archetype.
Структура папок для gswm-web-archetype должна быть похожа на отображенную на Рисунке 6-6.
Рис. 6-6. Структура проекта веб-архетипа
Когда проект создается из архетипа, Maven запрашивает у пользователя имя пакета. Maven создает структуру папок, соответствующую пакету, находящемуся в директории src/main/java созданного проекта. Затем Maven перемещает в этот пакет все содержимое из папки archetype-resources/src/main/java архетипа. Т.к. вы хотите, чтобы AppStatusServlet находился во вложенном пакете web.servlet, то создайте папку web/servlet и переместите AppStatusServlet туда. Новое расположение AppStatusServlet.java отображено на Рисунке 6-7.
Рис.6-7. AppStatusServlet в пакете web.servlet
Использование архетипов
Как только архетип был инсталлирован, то простейшим путем создать из него проект – это, находясь в папке C:\apress\gswm-book\chapter6, выполнить следующую команду:
В ответ на запросы Maven введите значения, указанные в Листинге 6-10, и вы увидите созданный проект.
Listing 6-10. Создание нового проекта с использованием архетипа
Т.к. файл pom.xml для test-project уже содержит плагин Tomcat, то для запуска проекта вызовите команду mvn tomcat7:run, находясь в папке C:\apress\gswmbook\chapter6\test-project. Откройте браузер и перейдите по адресу localhost:8080/test-project/status. Вы увидите надпись OK, как отображено на Рисунке 6-8.
Рис.6-8. Страница, выводимая сгенерированным проектом
Итоги
Архетипы Maven являются заготовками проектов, позволяющими быстро запускать новые проекты. В данной главе для генерации сложных Maven-проектов, таких как веб-проекты или мультимодульные проекты, использовались встроенные архетипы. Также вы познакомились с созданием и использованием пользовательских архетипов.
В следующей главе вы познакомитесь с основами генерации сайта, создания документации и отчетов при помощи Maven.