Когда переводил на 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'е. Если будут какие-то исправления — с радостью включу сюда.