Простой модульный web проект с maven. Часть 1

 

Трудно описать всю пользу использования maven при разработке и сборке web-приложений на Java. В данной статье я кратко опишу шаги для создания очень простого приложения, используя несколько maven модулей. Разбитие приложения на модули, в некоторых случаях, будет очень полезным архитектурным решением. С разбиением на модули, приложение получает больше гибкости, так как связь между модулями как правило довольно слабая (например через общую БД или посредством HTTP запросов), что делает модули, в каком-то смысле, независимыми друг от друга (например, к вашему приложению необходимо добавить панель администратора, уместно будет вынести ее в отдельный модуль, а связь с основным приложением реализовать через БД).

Также удобно с помощью модулей отстраивать иерархию приложения. Например, EJB приложения, реализующие бизнес логику, вынести в отдельный модуль, который будет собираться в jar, само web-приложение, реализующее логику взаимодействия и включая, например, сервлеты вынести в другой, который будет собираться в war. Оба эти модуля можно включить в третий модуль, который уже соберется в ear, и будет представлять все приложение целиком (на практике же, я чаще встречал объединение ejb и сервлетов в одном модуле).

Итак, создадим простое приложение, включающее модуль под web-приложение и модуль для сборки ear. Само приложение будет состоять из одинокого ejb, отвечающим на пару запросов.

Итак, нам понадобится:

  • maven
  • Java 8
  • Java IDE (в статьях будет IntellIJ IDEA 14 Ultimate)
  • JavaEE сервак (я буду использовать Wildfly 10, он же бывший JBoss)

Расчехляем IDEA и создаем проект (File ->New Project). Выбираем Maven. Вбиваем groupId и artifactId (ru.alexkulikov и demoit в моем случае). На след странице вводим имя проекта и готово.  У нас на руках почти пустой pom.xml и каталог src. Каталог src без зазрения совести удаляем. Далее нам понадобятся 2 модуля. Один из них будет содержать основную серверную часть, она же будет web-приложением, который при сборке будет собираться в war. Второй модуль нам понадобиться для сборки уже ear. В нашем примере это, конечно, избыточно, и создано в целях демонстрации.

Заходим в File -> Project Structure. Выбираем Modules, жмем на плюс, в списке выбираем самое верхнее New Module и вновь выбираем Maven. В Add as module to выбираем модуль проекта (demoIt), ну и в parent выбираем его же. ArtifactId зададим server. На следующей странице также укажем в названии модуля server. Проделаем данную операцию еще раз, уже указав artifactid и имя модуля server-ear.

Далее необходимо добавить к модулю server дескриптор развертывания web.xml. Не выходя из списка модулей выделяем server, жмем на плюс и выбираем Web. Тут же можно настроить его расположение в модуле, но сделаем это руками. Итак, у нас готовы два модуля. В дереве проекта разворачиваем модуль сервер. Переименовываем каталог web в webapp и перемещаем весь каталог в src/main (данные процедуры предназначены для maven-ear-plugin, чтобы не прописывать ему руками путь до дескриптора).

Итого получаем примерно такую структуру:

1

Продолжаем. В pom файле проекта добавим зависимости. Прежде всего нам нужен JavaEE, и связь с модулем server:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <version>${project.version}</version>
            <artifactId>server</artifactId>
            <type>war</type>
        </dependency>
    </dependencies>
</dependencyManagement>

Далее настраиваем плагины. Нам понадобятся maven ear и war плагины и maven compiler plugin. На настройках останавливаться подробно не буду, получаем:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.10.1</version>
                <configuration>
                    <version>7</version>
                    <defaultLibBundleDir>lib/</defaultLibBundleDir>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <attachClasses>true</attachClasses>
                    <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

С настройкой pom проекта закончили. Переходим к pom server-ear. Тут указываем packaging с типом ear и добавляем зависимости (уже без версий, так они будут ссылаться на зависимости из pom проекта):

<packaging>ear</packaging>

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>server</artifactId>
        <type>war</type>
    </dependency>
</dependencies>

И настраиваем ear plugin. Здесь мы добавляем наш server как web модуль. Обратите внимание на элемент contextRoot, в данном месте можно указать отдельный url под модуль. Для примера укажем api:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <configuration>
                <version>7</version>
                <applicationName>${project.artifactId}</applicationName>
                <generateApplicationXml>true</generateApplicationXml>
                <defaultLibBundleDir>lib</defaultLibBundleDir>
                <applicationName>${project.artifactId}</applicationName>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
                <modules>
                    <webModule>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>server</artifactId>
                        <contextRoot>/api</contextRoot>
                    </webModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>
</build>

И наконец настраиваем сервер. В pom просто добавляем packaging с типом war и зависимость на JavaEE:

<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

Далее напишем простенький EJB. В каталоге src создаем пакет (ru.alexkulikov) и создаем класс:

package ru.alexkulikov;

import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("/")
@Stateless
public class MainEJB {

    @Path("/echo")
    @GET
    public Response doEcho() {
        return Response.ok("HELLO WORLD!").build();
    }
}

Далее нам необходимо чтобы сервер знал, что выполнять запросы, которые мы описали в бине, будет собственно сам бин. Делается это крайне просто, в web.xml добавляем:

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Данный сервлет автоматически сделает за нас всю грязную работу (не пугайтесь если IDEA подчеркнет его красным – это нормально). И… все! Каркас нашего приложения готов. Теперь сборка. В командной строке переходим в каталог проекта и запускаем mvn clean install. Если видим в конце BUILD SUCCESS, то поздравляю, так как в созданной директории server-ear/target нас ожидает свежий server-ear-1.0-SNAPSHOT.ear. Дело за малым, скачиваем Wildfly, копируем наш ear в standalone/deployments, переходим в bin и запускаем standalone.bat. Если запуск пройдет без ошибок, то в логах в конце можно увидеть сообщение о регистрации контекста /api. Ну и тестируем:

2

 

 

One thought on “Простой модульный web проект с maven. Часть 1

  1. Полезная информация, спасибо.
    Буду следить за развитием Вашего блога.

Leave a Reply

Your email address will not be published. Required fields are marked *