Когда переводил на maven свои ejb3-проекты, порядком намучился с настройкой проекта, подключением «правильных» библиотек. Информации или не было, или она была устаревшей. В работе я использую JBoss 5.1.0.GA, поэтому все примеры будут на его основе.
Задача. Нужно создать maven2 проект для JBoss. Пусть, это будет Enterprise Application. Внутри — ejb3 модуль и web-приложение.
Самая большая сложность работы со связкой maven+JBoss — подбор зависимостей. JBoss довольно динамичный проект. С течением времени структура его меняется, нужные классы переползают из одного артефакта в другой. Для определения нужных зависимостей я разработал целый алгоритм:
Как правило, этого достаточно для поиска нужных зависимостей.
Структура каталогов, по идеологии мавен, задана заранее. Весь проект описывается в специальном файле pom.xml С помощью отдельных настроек в этом файле можно переделать всю структуру. Но лучше этого не делать — pom.xml усложнится и другим понимать, что и где у вас проекте, будет тяжело.
Проект будет составным. Корневой модуль, задающий общие настройки, и «дочерние» модули. Каждый модуль — это отдельное приложение (ejb3, war, ear). Создаем структуру каталогов
Теперь создаем pom.xml для корневого модуля. Файл привожу полностью, чтобы описать некоторые его элементы.
Все, головной проект описан. Теперь кратко о дочерних проектах.
В молуле ejb нужно поставить
Настройка ear модуля тоже имеет некоторые свои особенности. Все модули, которые мы хотим включить в итоговый ear-архив, дожны быть указаны в зависимостях. При сборке maven по цепочке обработает зависимости модулей и включит в архив все jar-ы со scope=compile. По умолчанию, эти архивы в application.xml не будут упомянуты. Для исправления ситуации используется специальный элемент.
Сборка производится командой
Естественно, maven должен быть установлен. При первом запуске он создаст каталог $HOME/.m2 и будет долго и нудно выкачивать зависимости проекта и зависимости зависимостей. Но это первый раз. Все скачанное он сложит в локальный кеш $HOME/.m2/repository и в будущем будет обращаться к нему.
Информация топика, скорее всего, подойдет для любого J2EE сервера. Но я не уверен, опробовано было на JBoss'е. Если будут какие-то исправления — с радостью включу сюда.
Задача. Нужно создать 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'е. Если будут какие-то исправления — с радостью включу сюда.