Введение в 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

$mvn archetype:generate [INFO] Scanning for projects... [INFO] [INFO] ----------------------------------------------------------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] ----------------------------------------------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone- pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone- pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone- pom [INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) ........................... ........................... 1176: remote -> ru.yandex.qatools.camelot:camelot-plugin (-) 1177: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-) 1178: remote -> sk.seges.sesam:sesam-annotation-archetype (-) 1179: remote -> tk.skuro:clojure-maven-archetype (A simple Maven archetype for Clojure) 1180: remote -> tr.com .lucidcode:kite-archetype (A Maven Archetype that allows users to create a Fresh Kite project) 1181: remote -> uk.ac.rdg.resc:edal-ncwms-based-webapp (-) 1182: local -> com.inflinx.book.ldap:practical-ldap-empty-archetype (-) 1183: local -> com.inflinx.book.ldap:practical-ldap-archetype (-) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 491:

Создание Веб-проекта

Maven предоставляет архетип maven-archetype-webapp, позволяющий сгенерировать веб-приложение. Давайте создадим такое приложение путем вызова следующей команды в папке C:\apress\gswm-book\chapter6:

mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp

Эта команда выполняется в интерактивном режиме. На поступающие вопросы введите следующую информацию:

Define value for property 'groupId': : com.apress.gswmbook Define value for property 'artifactId': : gswm-web Define value for property 'version': 1.0-SNAPSHOT: : <<Hit Enter>> Define value for property 'package': com.apress.gswmbook: : war  Confirm the properties configuration: groupId: com.apress.gswmbook artifactId: gswm-web version: 1.0-SNAPSHOT package: war Y: <<Hit Enter>> 

Сгенерированная структура папок должна походить на ту, что изображена на Рисунке 6-1:

Рисунок 6-1. Структура веб-проекта Maven

Файл pom.xml минимален и содержит единственную зависимость — JUnit. Maven может упростить запуск вашего веб-приложения, используя встроенные веб-серверы, такие как Tomcat или Jetty. Листинг 6-2 отображает модифицированный файл pom.xml с добавленным плагином Tomcat.

Листинг 6-2. Модифицированный файл pom.xml с внедренным плагином Tomcat

<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-web</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>gswm-web Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>gswm-web</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project>

Для того, чтобы запустить это веб-приложение на сервере Tomcat вызовите следующую команду в корневой директории проекта:

mvn tomcat7:run

Вы увидите развернутый проект и вывод, похожий на изображенный на Листинге 6-3.

Листинг 6-3. Вывод команды Tomcat run

Oct 11, 2014 12:08:43 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Tomcat Oct 11, 2014 12:08:43 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 Oct 11, 2014 12:08:45 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [334] milliseconds. Oct 11, 2014 12:08:45 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"]

Теперь запустите браузер и перейдите по адресу 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:

mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-parent         -Dversion=1.0.0-SNAPSHOT -DarchetypeGroupId=org.codehaus.mojo.archetypes               -DarchetypeArtifactId=pom-root

Архетип pom-root создает папку gswm-parent и в ней — файл pom.xml.

Как следует из Листинга 6-4, созданный файл pom.xml имеет минимальное содержимое. Заметьте, что в теге packaging родительского проекта указан тип pom.

Листинг 6-4. Родительский файл pom.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"> <modelVersion>4.0.0</modelVersion> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>gswm-parent</name> </project>

Теперь создайте веб-проект запуском следующей команды в папке C:\apress\gswm-book\chapter6\gswm-parent:

mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-web           -Dversion=1.0.0-SNAPSHOT -Dpackage=war -DarchetypeArtifactId=maven-archetype-webapp

В процессе генерации этого веб-проекта вы предоставили Maven такие координаты, как groupId, version и др. в виде параметров, переданные в генерирующую цель, которая и создала проект gswm-web.

Следующим шагом будет создание сервисного проекта. Находясь в папке C:\apress\gswm-book\chapter6\gswm-parent выполните следующую команду:

mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-service        -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart             -DinteractiveMode=false 

Обратите внимание, что вы не указывали параметр package, т.к. maven-archetype-quickstart создает JAR-проект по умолчанию. Также обратите внимание на использование параметра interactiveMode. Он просто указывает Maven выполнять команду, не запрашивая у пользователя никакой информации.

Аналогично предыдущему шагу, создайте следующий Java-проект gswm-repository путем выполнения в папке C:\apress\gswm-book\chapter6\gswm-parent следующей команды:

mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-repository      -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart              -DinteractiveMode=false

Теперь, когда у вас сгенерированы все проекты, взгляните на файл pom.xml в папке gswm-parent. Листинг 6-5 отображает его содержимое.

Listing 6-5. Родительской файл pom.xml с модулями

<?xml version="1.0" encoding="UTF-8"?> <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"> <modelVersion>4.0.0</modelVersion> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>gswm-parent</name> <modules> <module>gswm-web</module> <module>gswm-service</module> <module>gswm-repository</module> </modules> </project>

Элемент modules позволяет объявлять дочерние модули в мультимодульном проекте. По мере генерации каждого модуля Maven регистрирует их в качестве дочерних. Кроме того, он модифицирует файлы pom.xml самих модулей, добавляя в них информацию о родительском pom.xml. Листинг 6-6 отображает файл pom.xml проекта gswm-web, в котором указан родительский pom-элемент.

Listing 6-6. Файл pom.xml веб-модуля

<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <groupId>com.apress.gswmbook</groupId> <artifactId>gswm-web</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <name>gswm-web Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies>  <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>gswm-web</finalName> </build> </project>

Теперь, когда вся инфраструктура установлена, можно собрать следующий проект. Просто запустите команду mvn package находясь в папке gswm-project, как отображено в Листинге 6-7.

Listing 6-7. Команда Maven package, запущенная в директории родительского проекта

C:\apress\gswm-book\chapter6\gswm-parent>mvn package [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] gswm-parent [INFO] gswm-web Maven Webapp [INFO] gswm-service [INFO] gswm-repository [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] gswm-parent ....................................... SUCCESS [0.001s] [INFO] gswm-web Maven Webapp ............................. SUCCESS [1.033s] [INFO] gswm-service ...................................... SUCCESS [0.552s] [INFO] gswm-repository ................................... SUCCESS [0.261s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.949s [INFO] Finished at: Mon Oct 13 23:09:21 MDT 2014 [INFO] Final Memory: 6M/15M [INFO] ------------------------------------------------------------------------

Создание архетипов

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:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 	<display-name>Archetype Created Web Application</display-name> </web-app> 

3. Добавьте зависимость Servlet 3.0 в файл pom.xml. Обновленное содержимое pom.xml отображено в Листинге 6-8.

Листинг 6-8. Файл pom.xml с Servlet Dependency

<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/maven-v4_0_0.xsd"> 		<modelVersion>4.0.0</modelVersion> 		<groupId>com.apress.gswmbook</groupId> 		<artifactId>gswm-web</artifactId> 		<packaging>war</packaging> 		<version>1.0-SNAPSHOT</version> 		<name>gswm-web Maven Webapp</name> 		<url>http://maven.apache.org</url> 		<dependencies> 			<dependency> 				<groupId>javax.servlet</groupId> 				<artifactId>javax.servlet-api</artifactId> 				<version>3.0.1</version> 				<scope>provided</scope> 			</dependency> 			<dependency> 				<groupId>junit</groupId> 				<artifactId>junit</artifactId> 				<version>3.8.1</version> 				<scope>test</scope> 			</dependency> 		</dependencies> 		<build> 			<finalName>gswm-web</finalName> 			<plugins> 				<plugin> 					<groupId>org.apache.tomcat.maven</groupId> 					<artifactId>tomcat7-maven-plugin</artifactId> 					<version>2.2</version> 				</plugin> 			</plugins> 		</build> </project>

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

package com.apress.gswmbook.web.servlet;  import javax.servlet.annotation.WebServlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*;    @WebServlet("/status") public class AppStatusServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter writer = response.getWriter(); writer.println("OK"); response.setStatus(response.SC_OK); } } 

Прототипный проект по структуре будет поход на изображенный на Рис.6-5.

Рис. 6-5. Сгенерированный прототипный проект

Используя командную строку, перейдите в папку gswm-web-prototype проекта из выполните следующую команду:

mvn archetype:create-from-project

По завершению команды вы увидите сообщение 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. Структура проекта веб-архетипа

Давайте начнем процесс модификации с файла pom.xml, расположенного в папке gswm-web-archetype\src\main\resources\archetype-resources. Измените finalName в файле pom.xml с gswm-web на ${artifactId}. В процессе создания проекта Maven заменит выражение ${artifactId} значением, которое было предоставлено пользователем.

Когда проект создается из архетипа, 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

Откройте AppStatusServlet.java и измените имя пакета с package ${package}; на package ${package}.web.servlet;
Завершающим шагом в создании архетипа является выполнение следующей команды из командной строки, находясь в папке gswm-web-archetype:

mvn clean install

Использование архетипов

Как только архетип был инсталлирован, то простейшим путем создать из него проект – это, находясь в папке C:\apress\gswm-book\chapter6, выполнить следующую команду:

mvn archetype:generate -DarchetypeCatalog=local

В ответ на запросы Maven введите значения, указанные в Листинге 6-10, и вы увидите созданный проект.

Listing 6-10. Создание нового проекта с использованием архетипа

C:\apress\gswm-book\chapter6>mvn archetype:generate -DarchetypeCatalog=local [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache. maven.archetypes:maven-archetype-quickstart:1.0) Choose archetype:1: local -> com.apress.gswmbook:gswm-web-archetype (gswm-web-archetype) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1 Define value for property 'groupId': : com.apress.gswmbook Define value for property 'artifactId': : test-project Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': com.apress.gswmbook: : Confirm properties configuration: groupId: com.apress.gswmbook artifactId: test-project version: 1.0-SNAPSHOT package: com.apress.gswmbook Y: : ------------------------------------------------------------------------------ project [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1:27.635s [INFO] Finished at: Mon Oct 13 23:36:01 MDT 2014 [INFO] Final Memory: 9M/22M [INFO] ------------------------------------------------------------------------

Т.к. файл 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.

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *