Flex-Mojos. Пример сборки flex modules.
Предисловие
Flex модули на мой взгляд очень интересная и многообразная тема. Кроме разделения функциональности приложения, их можно использовать для загрузки внешних стилей и ресурсов. Если есть задача динамического изменения внешнего вида и языка или уменьшение размера основного приложения.
Введение
В данной статье я расскажу как собирать приложение которое использует flex modules.
Проект так же будет использовать библиотеки и уменьшать размер flex модулей. Для этого мы не будем включать в модуль код, который уже используется в основном приложении. Итак приступим.
Структура проекта
Данная структура соответствует принципу один maven модуль один артефакт. Следовательно flex модуль представлен ввиде отдельного maven модуля.
flexModulesProject/
flexModulesProject/pom.xml - основной pom, собирающий весь проект
//загрузчик модульного приложения.
flexModulesProject/flexClient/… - основное flex приложение
…
flexModulesProject/flexModuleRed/… - flex модуль
…
flexModulesProject/flex/pom.xml - корневой pom для flex приложение.
flexModulesProject/flexCoreLib/… - flex библиотека которая используется в проекте.
Разбор конфигурационных файлов проекта
на родительский pom проекта, pom библиотеки и корневой pom для flex проектов использование модуля ни как не повлияло. Более подробное описание их структуры можно посмотреть здесь.
pom для flexClient
XML:
<?xml version="1.0"?> | |
<project> | |
<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> | |
| |
<build> | |
<plugins> | |
<plugin> | |
<groupId>info.rvin.mojo</groupId> | |
<artifactId>flex-compiler-mojo</artifactId> | |
<configuration> | |
<debug>true</debug> | |
<sourceFile>flexClient.mxml</sourceFile> | |
<linkReport>true</linkReport> | |
</configuration> | |
</plugin> | |
</plugins> | |
</build> | |
| |
| |
<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> |
Здесь существенна одна дирректива:
XML:
<linkReport>true</linkReport> |
данная строчка создает в maven репозитории xml файл с перечнем всех классов, которые включаются в данный swf. Этот перечень будет использоваться при копмиляции flex модуля.
pom для flexModuleRed
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 http://maven.apache.org/maven-v4_0_0.xsd"> | |
<modelVersion>4.0.0</modelVersion> | |
<parent> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>my-flex-super-pom</artifactId> | |
<version>1.0</version> | |
</parent> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flexModuleRed</artifactId> | |
<packaging>swf</packaging> | |
<name>flex module red</name> | |
<version>1.0</version> | |
<build> | |
<plugins> | |
<plugin> | |
<groupId>info.rvin.mojo</groupId> | |
<artifactId>flex-compiler-mojo</artifactId> | |
<configuration> | |
<debug>true</debug> | |
<sourceFile>FlexModuleRed.mxml</sourceFile> | |
<loadExterns> | |
<MavenArtifact> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-client</artifactId> | |
<version>1.0</version> | |
</MavenArtifact> | |
</loadExterns> | |
| |
| |
| |
</configuration> | |
</plugin> | |
</plugins> | |
</build> | |
<dependencies> | |
<dependency> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-core-library</artifactId> | |
<version>1.0</version> | |
<type>swc</type> | |
<scope>external</scope> | |
</dependency> | |
</dependencies> | |
</project> |
следующий код:
Code:
<loadExterns> | |
<MavenArtifact> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-client</artifactId> | |
<version>1.0</version> | |
</MavenArtifact> | |
</loadExterns> |
исключает классы которые включены в flex-client.
здесь:
Code:
<dependency> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>flex-core-library</artifactId> | |
<version>1.0</version> | |
<type>swc</type> | |
<scope>external</scope> | |
</dependency> |
важно включение библиотеки со scope external.
Еще одно замечание, имя flex модуля не должно использовать дефис, в моём проекте это вызвало необъяснимый глюк.
Сборока проекта.
Для сборки проекта необходимо в корневой библиотеке проекта запустить команду mvn install
Развертывание проекта.
Строго говоря, в обязанности maven эта задача не входит. После того как проект будет собран, нужно поместить flexModuleRed.swf в одну папку с flexClient.swf.
Исходники
Исходники можно взять отсюда
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
Исходники
Flex-Mojos, Управление зависимостями.
Введение
В данной статье будет рассмотрена тема управление зависимостями при сборки flex приложения с помощью maven.
содержание предыдущих серий:
Пара общих слов о maven
Сборка простого flex приложения с помощью Flex Mojos;
Генерация html wrapper c помощью flex-mojos;
Что такое maven зависимости?
Допустим мы хотим используем в своём проекте, внешнюю swc. В Flex Builder необходимо её подключить. В maven это решается с помощью указания зависимости от maven артефакта. Этот артефакт представляет собой ссылку на swc в репозитории maven.
Пример:
Code:
<project> | |
... | |
<dependencies> | |
<dependency> | |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>mylibrary</artifactId> | |
<version>1.0</version> | |
<type>swc</type> | |
<scope>external</scope> | |
</dependency> | |
... | |
<dependencies> | |
... | |
</project> |
Теги: groupId, artifactId, version, type - определяют путь к артефакту в maven repository,
Тег scope - определяет, как будет использоваться артефакт и может принимать следующие значения:
external - код swc, используется только для компиляции.
internal - код swc, полностью включается в итоговый проект.
merged - включается только та часть кода swc , которая используется в вашем проекте. Данное значение используется по умолчанию.
rsl - будет загружать swf, как rsl
caching - тоже что и rsl, но только для adobe библиотек swz, которые могут кэшироваться fp.
test - для компиляции тестов.
Я выделил жирным значения scope и тип артефакта с которым используется scope.
Как поместить артефакт в репозиторий?
Собственные библиотеки
Если вы собираете библиотеку с помощью maven, то она попадает в репозиторий после выполнения команды >mvn install.
После этого её можно использовать в любом вашем проекте указав зависимость.
Внешние библиотеки
В данный момент maven не слишком распространён в среде flex разработки. Поэтому общие библиотеки которые могут вам понадобиться(as3corelib, caingorm и т.д.) обычное не лежат в публичных репозиториях. Следовательно вам необходимо выложить их в свой локальный репозиторий. Для этого существует специальная команда maven:
Code:
mvn install:install-file -Dfile= -DgroupId= \ -DartifactId= -Dversion= -Dpackaging= |
Дополнения
Информациию о scopes и dependency можно также посмотреть на blog.flex-mojos;
Генерация html wrapper c помощью flex-mojos
Введение
Получить общее представление и посмотреть простой пример, c помощью flex mojos, можно здесь.
Также возможно ознакомиться с первоисточником Html Wrapper Mojo от Marvin Froeder’s, создателя flex mojos.
Знакомство с html-wrapper-mojo
Для того что бы сгенерить html wrapper для swf, достаточно в pom.xml
добавить mojo html-wrapper-mojo.
XML:
... | |
<plugins> | |
<plugin> | |
<groupId>info.flex-mojos</groupId> | |
<artifactId>html-wrapper-mojo</artifactId> | |
<executions> | |
<execution> | |
<goals> | |
<goal>wrapper</goal> | |
</goals> | |
</execution> | |
</executions> | |
<configuration> | |
<templateURI>embed:client-side-detection</templateURI> | |
<parameters> | |
<swf>${build.finalName}</swf> | |
<width>200</width> | |
<height>200</height> | |
</parameters> | |
</configuration> | |
</plugin> | |
</plugins> | |
... |
Конфигурация html-wrapper-mojo
тег templateURI
определяет один из варинтов шаблона от Adobe:
embed:client-side-detection
embed:client-side-detection-with-history (default)
embed:express-installation
embed:express-installation-with-history
embed:no-player-detection
embed:no-player-detection-with-history
или
URI на ваш собственный шаблон, например:"file:///etc/hosts". При этом файл с вашим шаблоном должен содержать index.template.html и быть в формате zip.
тег parameters
позволяет установить значения всем стандартным свойствам шаблона
title
version_major - требуемая версия fp, по умолчанию 9;
version_minor - требуемая минимальная версия fp, по умолчанию 0;
version_revision - требуемая ревизия, напрмер 115, по умолчанию 0;
swf - имя swf файла;
width
height
bgcolor
application - имя swf объекта внутри html.
Если вы используете свой собственный шаблон, то можете определить дополнительные параметры.