| « Flex-Mojos. Пример сборки flex modules. | Flex-Mojos, Управление зависимостями. » |
Flex-Mojos. Пример сборки модульного проекта.
Глоссарий
flex module - swf, которая может быть загружена или выгружена flex приложением. Она не может быть запущена независимо. Несколько приложений могут использовать один и тотже модуль.(как собирать flex модули я опишу в следующей статье)
maven module - логическая часть вашего проекта, например клиентские программы, библиотеки, серверные модули, модули конфигурации и т.п.
Введение
Рассмотрим сборку проекта состоящего их нескольких maven модулей. Для построения такого проекта нам потребуется, создать иерархическую структуру директорий, для каждого модуля своя директория, в каждой директории будет находиться исходный код модуля и роm.xml, который его собирает. В корневой директории будет находится родительский pom для всего проекта.
Структура проекта
Проект состоит из двух модулей:
корень проекта:
multyModulesProject/pom.xml - родительский роm.xml
flex библиотека:
multyModulesProject/flexCoreLibrary/pom.xml;
multyModulesProject/flexCoreLibrary/…;
flex приложение:
multyModulesProject/flexClient/pom.xml;
multyModulesProject/flexClient/…;
Наследование от flex-super-pom
Это достаточно тонкий момент. Возможны следующий решения:
- Унаследовать родительский pom от flex-super-pom. При данном решении возникает вопрос, что делать с модулями которые не имеют отношения к flex.
- Прописать все необходимые свойства непосредственно в дочерние модули. Приводит к излишнему дублированию кода.
- Создать ещё один уровень иерархии. С модулями flex и java например. В модуле flex будет находиться my-flex-super-pom. Наследуется от родительского pom всего проекта и включает все необходимые параметры из flex-super-pom. Все maven модули собирающие flex, наследуются от my-flex-super-pom и помещаются в директорию flex. Недостаток данного метода в появлении ещё одного уровня иерархии.
- И последний вариант, который я использую: Появляется модуль flex и my-flex-super-pom, как в предыдущем решении, но не создается иерархия. Все модули помещаются в корневую директорию. Модули собирающие flex артифакты наследуются от my-flex-super-pom. Сложность здесь в некоторой путанице с наследованием. Она не всегда совпадает с директориями, в которых находятся модули.
В итоге к нашему проекту добавился ешё один модуль flex.
multyModulesProject/flex/pom.xml; - по умолчанию полностью повторяет структуру flex-super-pom, но наследуется от родительского pom.
Родительский pom проекта
Родительский pom.xml нашего проекта может выглядеть следующим образом:
XML:
<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"> | |
<modelVersion>4.0.0</modelVersion> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>myProjectArtifactId</artifactId> | |
<name>myProjectName</name> | |
<packaging>pom</packaging> | |
<version>1.0</version> | |
<url>http://maven.apache.org</url> | |
<modules> | |
<module>flex</module> | |
<module>flexCoreLibrary</module> | |
<module>flexClient</module> | |
</modules> | |
<repositories> | |
<repository> | |
<id>flex-mojos-repository</id> | |
<url>http://svn.sonatype.org/flexmojos/repository/</url> | |
<releases> | |
<enabled>true</enabled> | |
</releases> | |
</repository> | |
</repositories> | |
| |
<pluginRepositories> | |
| |
<pluginRepository> | |
<id>flex-mojos-repository</id> | |
<url>http://svn.sonatype.org/flexmojos/repository/</url> | |
<releases> | |
<enabled>true</enabled> | |
</releases> | |
<snapshots> | |
<enabled>false</enabled> | |
</snapshots> | |
</pluginRepository> | |
</pluginRepositories> | |
</project> |
На что стоит обратить внимание:
XML:
<packaging>pom</packaging> |
определяет тип собираемого артефакта, в данном случае pom.xml, оперирует другими pom.xml. Тип родительского модуля логический, обозначается “pom".
XML:
... | |
<modules> | |
<module>flex</module> | |
<module>flexCoreLibrary</module> | |
<module>flexClient</module> | |
| |
</modules> | |
... |
здесь перечислены модули проекта, наименования должны совпадать с наименованием директорий.
XML:
... | |
<repositories> | |
... |
тег repositories, выноситься в родительский pom.xml, так как maven поддерживает наследование, то данное свойство будет доступно в дочерних модулях.
Замечу что если у вас несколько проектов, то лучше его вынести в файл конфигурации maven.
под winXP, он находиться в: “C:\Documents and Settings\username\.m2\settings.xml", в других OS в той-же по смыслу директории.
my-flex-super-pom
Находиться в дирректории: multyModulesProject/flex
Отличается от flex-super-pom, добавлением кода определяющего родителя:
XML:
... | |
<parent> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>myProjectArtifactId</artifactId> | |
<version>1.0</version> | |
</parent> | |
... |
и другим именем:
XML:
... | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>my-flex-super-pom</artifactId> | |
<version>1.0</version> | |
<name>parent pom for building modules with flex</name> | |
<packaging>pom</packaging> | |
... |
flex-core-library
Находится в директории: multyModulesProject/flexCoreLibrary:
XML:
<?xml version="1.0"?> | |
<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 href="http://maven.apache.org/maven-v4_0_0.xsd">">http://maven.apache.org/maven-v4_0_0.xsd"> | |
<parent> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>my-flex-super-pom</artifactId> | |
<version>1.0</version> | |
</parent> | |
| |
<modelVersion>4.0.0</modelVersion> | |
| |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-core-library</artifactId> | |
<packaging>swc</packaging> | |
<name>flex-core-library</name> | |
<version>1.0</version> | |
| |
</project> |
Тег parent
устанавливает родительский pom. Теперь всё что определено в my-flex-super-pom будет доступно в данном проекте.
flex-client
Находится в директории: multyModulesProject/flexClient
XML:
<?xml version="1.0"?> | |
<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 href="http://maven.apache.org/maven-v4_0_0.xsd">">http://maven.apache.org/maven-v4_0_0.xsd"> | |
<parent> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>my-flex-super-pom</artifactId> | |
<version>1.0</version> | |
</parent> | |
| |
<modelVersion>4.0.0</modelVersion> | |
| |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-client</artifactId> | |
<packaging>swf</packaging> | |
<name>flex client</name> | |
<version>1.0</version> | |
| |
<dependencies> | |
<dependency> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-core-library</artifactId> | |
<version>1.0</version> | |
<type>swc</type> | |
<scope>internal</scope> | |
</dependency> | |
</dependencies> | |
</project> |
Тег parent
устанавливает родительский pom. Теперь всё что определено в my-flex-super-pom будет доступно в данном проекте.
Тег dependency
определяет зависимость flex-client от flex-core-library
Исходники
2 комментариев
Хехе. Отлично. Респект. В мемориз. Очень толково и подробно все описал.
Спасибо! Очень приятно получить обратную связь.