Pull to refresh

Собираем JavaEE приложение maven'ом

Reading time5 min
Views7.1K
Когда переводил на maven свои ejb3-проекты, порядком намучился с настройкой проекта, подключением «правильных» библиотек. Информации или не было, или она была устаревшей. В работе я использую JBoss 5.1.0.GA, поэтому все примеры будут на его основе.
Задача. Нужно создать maven2 проект для JBoss. Пусть, это будет Enterprise Application. Внутри — ejb3 модуль и web-приложение.

Самая большая сложность работы со связкой maven+JBoss — подбор зависимостей. JBoss довольно динамичный проект. С течением времени структура его меняется, нужные классы переползают из одного артефакта в другой. Для определения нужных зависимостей я разработал целый алгоритм:
  • находим jar, который включает нужный класс, если повезет то архив собран с помощью maven'а и внутри в META-INF/maven есть все нужное описание
  • если не повезло — в корневом каталоге JBoss находим файл jar-versions.xml, в нем ищем описание версии
  • Заходим в репозиторий JBoss'а и пытаемся найти подходящий артефакт

Как правило, этого достаточно для поиска нужных зависимостей.

Структура каталогов, по идеологии мавен, задана заранее. Весь проект описывается в специальном файле pom.xml С помощью отдельных настроек в этом файле можно переделать всю структуру. Но лучше этого не делать — pom.xml усложнится и другим понимать, что и где у вас проекте, будет тяжело.

Проект будет составным. Корневой модуль, задающий общие настройки, и «дочерние» модули. Каждый модуль — это отдельное приложение (ejb3, war, ear). Создаем структуру каталогов
# ejb-3 модуль
mkdir -p jee-project/ejb/src/main/java
mkdir -p jee-project/ejb/src/main/resources
mkdir -p jee-project/ejb/src/test/java
#web модуль
mkdir -p jee-project/web/src/main/java
mkdir -p jee-project/web/src/main/resources
mkdir -p jee-project/web/src/main/webapp
mkdir -p jee-project/web/src/test/java
#ear модуль
mkdir -p jee-project/ear


Теперь создаем 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>my.labs</groupId>

    <!-- Идентификатор самого проекта. -->
    <artifactId>jee-project</artifactId>

    <!-- Важный момент. Указывает на "тип" проекта. Если проект содержит подпроекты
       (модули) — обязательно должен указан "pom" -->
    <packaging>pom</packaging>

    <!-- Версия. SNAPSHOT указывает, что работа ведется. Идеалогия maven предполагает,
       что разработка ведется над SHAPSHOT-версиями. По готовности с помощью специальной
       процедуры выпускаеся "релиз". Лучше следовать общепринятой схеме, меньше
       неожиданностей будет -->
    <version>1.0-SNAPSHOT</version>

    <!-- Перечисляем модули, входящие в текущий проект, фактически — это название каталогов,
       в которых maven будет искать дочерние модули. -->
    <modules>
        <module>ejb</module>
        <module>web</module>
        <module>ear</module>
    </modules>

    <!-- В блоке dependencyManagement указываются зависимости, коорые встречаются во всем проекте,
       в т.ч. в  модулях. В самих подпроектах достаточно сослаться на уже упомянутые зависимости. -->
    <dependencyManagement>
        <dependencies>

            <!-- junit будет использоваться для тестирования, о чем говорил <scope>test</scope> -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.4</version>
                <scope>test</scope>
            </dependency>

            <!-- набор зависимостей для JavaEE -->
            <dependency>
                <groupId>javax.annotation</groupId>
                <artifactId>jsr250-api</artifactId>
                <version>1.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.ejb</groupId>
                <artifactId>ejb-api</artifactId>
                <version>3.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.jms</groupId>
                <artifactId>jms</artifactId>
                <version>1.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.persistence</groupId>
                <artifactId>persistence-api</artifactId>
                <version>1.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- укажем кодировку исходиков и версию java -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>




Все, головной проект описан. Теперь кратко о дочерних проектах.
В молуле ejb нужно поставить
<packaging>ejb</packaging>
и описать настройки сборки ejb3
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <ejbVersion>3.0</ejbVersion>
                </configuration>
            </plugin>
        </plugins>
    </build>


Настройка ear модуля тоже имеет некоторые свои особенности. Все модули, которые мы хотим включить в итоговый ear-архив, дожны быть указаны в зависимостях. При сборке maven по цепочке обработает зависимости модулей и включит в архив все jar-ы со scope=compile. По умолчанию, эти архивы в application.xml не будут упомянуты. Для исправления ситуации используется специальный элемент.
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <version>5</version>

                    <!-- перечисляем модули -->
                    <modules>
                        <ejbModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>ejb</artifactId>
                        </ejbModule>
                        <webModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>web</artifactId>
                        </webModule>
                    </modules>
                    <!-- тот самый элемент, который задает необходимость указания всех библиотек в application.xml -->
                    <includeLibInApplicationXml>true</includeLibInApplicationXml>
                </configuration>
            </plugin>
        </plugins>
        <finalName>${project.parent.artifactId}</finalName>
    </build>


Сборка производится командой
mvn package

Естественно, maven должен быть установлен. При первом запуске он создаст каталог $HOME/.m2 и будет долго и нудно выкачивать зависимости проекта и зависимости зависимостей. Но это первый раз. Все скачанное он сложит в локальный кеш $HOME/.m2/repository и в будущем будет обращаться к нему.
Информация топика, скорее всего, подойдет для любого J2EE сервера. Но я не уверен, опробовано было на JBoss'е. Если будут какие-то исправления — с радостью включу сюда.
Tags:
Hubs:
Total votes 17: ↑14 and ↓3+11
Comments8

Articles