| « Flex mojos 3.1 released | Flex-Mojos. Пример сборки модульного проекта. » |
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.
Исходники
Исходники можно взять отсюда
7 комментариев
Спасибо за статьи. Ты как-то писал о зависимостях от сторонних библиотек. А ты думал о http://maven.apache.org/guides/mini/guide-central-repository-upload.html ? То есть закачать в центральное хранилище и не париться? Тот же as3crypto вполне удовлетворяет всем условиям.
Если проект поддерживает maven, то выкладкой его в общественный репозиторий обычно занимаются его создатели.Что бы обеспечить актуальность и целостность артефакта.
Сторонний проект, который не поддерживает maven сборку, можно положить в свой репозиторий.
Иногда, для популярных проектов, частные репозитории шаряться между комьюнити. Пример flex SDK, или BlaseDS.
Замечательная статья ) огромное сасибо.Собственно возник вопрос, а как сделать автоматическое развертывание в одну папочку ... может подскажете куда копать
Для построения собственной структуры папок и файлов можно использовать Maven Assemblies.http://books.sonatype.com/maven-book/reference/assemblies.html#sect-output-algorithm
-------------------------------------------
Развертывание сильно зависит от специфики сервера. Например, для sertvlet container (Tomcat, JBoss, т.п) собирается war архив. Скопировать дополнительные артефакты(swf и т.п.) можно с помощю maven-dependency-plugin.
попробывал пример но скомпилированый результат ругается VerifyError: Error #1014: Class mx.core::LayoutContainer could not be found. причем если билдить флексбилдером те же файлы (простейшие апликейшн и модуль)то там все ок но размер модуля немножко больше. очевидно что флексбилдер компилирует как-то по особенному. небольшое расследование показало что флексбилдер не использует стандартный механихм с link-report файлом а спаивает компилятор конфигом где указаны какие классы надо исключить - я так понимаю таким образом модули можно компилировать отдельно и вначале. и что наиболее обыдно, по-другому пути(обычному, через линк-репорт) не получается скомпилировать нормально запускающийся модуль. буду признателен за идеи как же все-таки можно заставить закомпилить модули с флексмоджосами )
рекомендую использовать новый flex-mojos. вот тут я описал отличияhttp://riapriority.com/blogs/agahov.php/2009/04/14/flex-mojos-3-1-released
Потому как много воды утекло, а разбираться почему перестала рабтать устаревшая версия смысла нет.
возможно что проблема в том, что классы не попали не в основное приложение ни в модуль. Flex компилятор не включает в код классы которые не используются в приложении. Следовательно нужно указывать компилятору какие доп. классы включать, или по простому завести переменную искомого класса(для пробы).
ну я сразу использовал самую новую версию плагина(org.sonatype.flexmojos:flexmojos-maven-plugin:3.2)генерировал линк рипорт для апликейшена и модуля - LayoutContainer включается в апликейшн и исключается (экстернал) для модуля, что логично. пробывал принудительно включить клас LayoutContainer в модуль (через ) но ноль эффекта.. я уже начал думать на безопасность но ошибка была бы другая да и все свифки локал-трастед...
в общем попробую делать так как флексбилдер - компилировать модуль с конфигурацией исключающей все классы фреймворка - конечно не совсем читый подход так как свои классы таки будут повторяться...