Каждый раз когда пишу новый J2EE проект, то я использую maven-ear-plugin. И хоть нужно это редко, но когда нужно всегда забываю как им пользоваться и приходится собирать информацию по кускам в интернете. Это и побудило меня написать статью, чтобы раз и навсегда зафиксировать эту информацию в одном месте.
Допустим вы создаете каркас J2EE проекта. Для простоты он будет состоять из модуля бизнес логики (EJB) и WEB-модуля, который включает в себя сервлеты, jsp, js скрипты и другие ресурсы. И все это необходимо упаковать в архив EAR. Если вы новичок, то, наверняка, спросите из чего состоит архив EAR.
Структура простого EAR архива
<?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>
<packaging>ear</packaging>
<parent>
<groupId>com.example.project</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ear</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>business</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
</dependencies>
</project>
Пример результирующего дескриптора развертывания application.xml, который сгенерировался после выполнения mvn clean install, используя вышеупомянутый pom.xml:
Допустим вы создаете каркас J2EE проекта. Для простоты он будет состоять из модуля бизнес логики (EJB) и WEB-модуля, который включает в себя сервлеты, jsp, js скрипты и другие ресурсы. И все это необходимо упаковать в архив EAR. Если вы новичок, то, наверняка, спросите из чего состоит архив EAR.
Структура простого EAR архива
- Дескриптор развертывания приложения META-INF/application.xml.
- Любое количество EJB-модулей, которые содержатся в JAR архивах со своими дескрипторами внутри.
- Любое количество Java библиотек, которые так же содержатся в JAR архивах.
- Web-модуль, который содержится в WAR архиве и содержит дескриптор WEB-INF/web.xml, сервлеты, jsp файлы и другие ресурсы.
Со структурой разобрались. Теперь давайте разберемся как построить такую структуру используя maven-ear-plugin:
- Внутри тега <project> добавьте <packaging>ear</packaging>. Это скажет maven-у использовать maven-ear-plugin при сборке данного модуля.
- Добавьте зависимости на EJB-модули, обычные JAR-модули и WEB-модуль. При добавлении зависимости на EJB-модули необходимо указывать <type>ejb</type> хотя они и хранятся в обычных JAR архивах. При добавлении WEB-модуля необходимо указывать <type>war</type>.
В самом простом случае этого достаточно. У вас создастся EAR архив, который будет содержать все необходимое для деплоя на сервер приложений. Результирующий pom.xml для EAR-модуля:
<?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>
<packaging>ear</packaging>
<parent>
<groupId>com.example.project</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ear</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>business</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
</dependencies>
</project>
Пример результирующего дескриптора развертывания application.xml, который сгенерировался после выполнения mvn clean install, используя вышеупомянутый pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>ear</display-name>
<module>
<ejb>business-1.0-SNAPSHOT.jar</ejb>
</module>
<module>
<web>
<web-uri>web-1.0-SNAPSHOT.war</web-uri>
<context-root>/web</context-root>
</web>
</module>
</application>
Тонкая настройка maven-ear-plugin
Для более тонкой настройки maven-ear-plugin необходимо добавить его конфигурацию в секцию <build>.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.8</version>
<configuration>
...
</configuration>
</plugin>
</plugins>
</build>
По-умолчанию дескриптор развертывания приложения application.xml берется из директории ${basedir}/src/main/application/META-INF/application.xml или генерируется автоматически если он там отсутствует.
Давайте добавим свой собственный дескриптор развертывания и переименуем архивы EJB-модуля и WEB-модуля. Для добавления собственного дескриптора развертывания необходимо добавить <applicationXml>${basedir}/src/main/resources/META-INF/application.xml</applicationXml>. Полный текст самописного дескриптора развертывания.
<?xml version="1.0" encoding="UTF-8"?>
<application 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/application_6.xsd"
version="6">
<display-name>SampleApplication</display-name>
<module>
<ejb>business.jar</ejb>
</module>
<module>
<web>
<web-uri>web.war</web-uri>
<context-root>sampleapp</context-root>
</web>
</module>
</application>
Мы указали что архив EJB-модуля будет находится в корне с именем business.jar, а архив WEB-модуля будет так же находиться в корне с именем web.war и корневой URL(context-root) /sampleapp. Поскольку на одном сервере приложений может находится несколько приложений, то WEB-модули нужно как-то разграничивать. Для этого и нужен context-root. Каждый ресурс WEB-модуля доступен по URL начиная с его context-root. Добавляем настройки в pom.xml 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>
<packaging>ear</packaging>
<parent>
<groupId>com.example.project</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ear</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>business</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.8</version>
<configuration>
<applicationXml>${basedir}/src/main/resources/META-INF/application.xml</applicationXml>
<modules>
<ejbModule>
<groupId>${project.groupId}</groupId>
<artifactId>business</artifactId>
<bundleFileName>business.jar</bundleFileName>
</ejbModule>
<webModule>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<bundleFileName>web.war</bundleFileName>
</webModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
</project>
Теперь давайте переименуем результирующий EAR архив. Для этого добавим в pom.xml EAR-модуля <earName>SampleApplication</earName>. Здесь расширение .ear писать необязательно, но если в настройках какого-либо модуля в теге <bundleFileName> напишите без расширения, то архив так и положится без расширения. Это не совсем то что нужно.
Давайте посмотрим последнюю версию 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>
<packaging>ear</packaging>
<parent>
<groupId>com.example.project</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ear</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>business</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.8</version>
<configuration>
<earName>SampleApplication</earName>
<applicationXml>${basedir}/src/main/resources/META-INF/application.xml</applicationXml>
<modules>
<ejbModule>
<groupId>${project.groupId}</groupId>
<artifactId>business</artifactId>
<bundleFileName>business.jar</bundleFileName>
</ejbModule>
<webModule>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<bundleFileName>web.war</bundleFileName>
</webModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
</project>
Конечно есть еще очень много настроек maven-ear-plugin, но в данной статье все описывать я не буду. За более подробным описанием настройки maven-ear-plugin обращайтесь на официальный сайт maven-ear-plugin.
Комментариев нет:
Отправить комментарий