Рубрика: Flex
Сборка простого flex приложения с помощью Flex Mojos
Разберу как собрать простой проект с помощью Flex Mojos.
Начальные условия
установленная java jdk 5 или выше.
переменная окружения JAVA_HOME
установленный maven.
Стандартная для maven структура проекта
project-name/pom.xml………………. конфигурационный файл сборки проекта.
project-name/src
project-name/src/main/
project-name/src/main/flex…………. код flex приложения
project-name/src/test
project-name/src/test/flex…………. тесты flex приложения
project-name/src/main/flex/Main.mxml
Структура pom.xml
pom собирающий flex приложение:
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>info.rvin.mojo</groupId> | |
<artifactId>flex-super-pom</artifactId> | |
<version>1.0</version> | |
</parent> | |
| |
<modelVersion>4.0.0</modelVersion> | |
| |
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>myArtifactId</artifactId> | |
<packaging>swf</packaging> | |
<name>myArtifactName</name> | |
<version>1.0</version> | |
| |
| |
<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> |
Запуск сборки проекта с помощью maven
Для сборки приложения необходимо набрать в командной строке,
project-name> mvn install
Рассмортим pom.xml по частям
XML:
<parent> | |
<groupId>info.rvin.mojo</groupId> | |
<artifactId>flex-super-pom</artifactId> | |
<version>1.0</version> | |
</parent> |
тег parent определяет родительский pom, для текущего pom.
В maven, текущий проект наследует свойства родительского.
В качестве родительского pom, для flex проекта здесь выступает flex-super-pom, который является частью flex-mojos. В нём определены многие полезные параметры, которые можно использовать по умолчанию. В своём проекте вы можете использовать собственный parent, взяв из flex-super-pom только необходимое.
Следующие теги определяют ваш артефакт в репозитории maven. В дальнейшем вы сможете использовать данный артифакт в других проектах.
XML:
<groupId>com.mydomain.mypackage</groupId> | |
<artifactId>myArtifactId</artifactId> | |
<packaging>swf</packaging> | |
<name>myArtifactName</name> | |
<version>1.0</version> |
Стоит отметить
XML:
<packaging>swf</packaging> |
- определяет тип артифакта, для библиотеки это swc.
XML:
<repositories> | |
<repository> | |
<id>flex-mojos-repository</id> | |
<url>http://svn.sonatype.org/flexmojos/repository/</url> | |
<releases> | |
<enabled>true</enabled> | |
</releases> | |
</repository> | |
</repositories> |
тег repositories определяет перечень репозиториев, в которых можно осуществлять поиск артифактов.
XML:
<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> |
тег pluginRepositories определяет перечень репозиториев, в которых можно осуществлять поиск maven плагинов.
Полезные дополнения
Удаление артефактов осуществляется командой project-name>mvn clean
Генерация asdoc, осуществляется командой project-name>mvn asdoc:asdoc
Команды можно комбинировать, например project-name>mvn clean install
Что ещё может Flex mojos?
Компелить SWF, SWC, ASWF, ASWC.
Запускать тесты.
Поддерживать RSL.
Оптимизировать, шифровать swf.
Создавать html wrapper,
В итоге собирать сложные проекты, включающие библиотеки, стили, локализацию, flex модули.
Плюсы использования maven для flex сборки
По моему опыту плюсом является стандартизация структуры проекта. Для того что бы понять что откуда берёться, достаточно посмотреть pom.xml.
Flex Mojos - A Maven Flex Plugin
Недавно вышел новый Flex Mojos - A Maven Flex Plugin. Если вы собираетесь внедрять maven, рекомендую к нему присмотреться.
Сборка приложения использующего BlazeDS, Spring, Hibernate. очень хорошо описана в наборе статей (Flex, Spring and BlazeDS: the full stack! part 1, part2 , part3, part4)
Flex + Maven часть1
Для сборки flex c помощью maven необходимо произвести следующие действия:
- установить MAVEN
- установить flex sdk
- создать файл проекта pom.xml
- настроить среду
- создать структуру проекта и Main.mxml
- запустить maven
Создание файла проекта pom.xml
плагин для сборки swf/swc http://www.israfil.net
пример pom.xml для flex
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"> | |
| |
<name>test-flex-swf</name> | |
<groupid>test</groupid> | |
<artifactid>test-flex-swf</artifactid> | |
<version>1.0</version> | |
<modelversion>4.0.0</modelversion> | |
<description>test build flex with maven. | |
see: </description>">http://riapriority.com/blogs/agahov.php</description> | |
| |
<packaging>swf</packaging> | |
| |
<properties> | |
<flex .home>C:/FLEX_HOME/sdk/2.0.1</flex> | |
</properties> | |
<build> | |
<plugins> | |
<plugin> | |
<groupid>net.israfil.mojo</groupid> | |
<artifactid>maven-flex2-plugin</artifactid> | |
<extensions>true</extensions> | |
<configuration> | |
<flexhome>${flex.home}</flexhome> | |
<mainmxmlfile>Main.mxml</mainmxmlfile> | |
</configuration> | |
</plugin> | |
</plugins> | |
</build> | |
</project> |
Настройка среды
- flex.home в pom.xml должна ссылаться на flex sdk, которую вы хоти использовать для сборки
не забудте в файле $flex.home/frameworks/flex-config.xml отредактировать следующую строку:
winFonts.ser - для windows
macFonts.ser - для MAC
XML:
<flex -config> | |
<compiler> | |
<fonts> | |
<local -fonts-snapshot>---Fonts.ser</local> | |
</fonts> | |
</compiler> | |
</flex> |
Cтруктура проекта
project-name/pom.xml
project-name/src
project-name/src/main/
project-name/src/main/flex
project-name/src/test
project-name/src/main/flex/Main.mxml
Main.mxml может быть таким:
XML:
<?xml version="1.0" encoding="utf-8"?> | |
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> | |
<mx:Script> | |
<![CDATA[ | |
import mx.controls.Alert; | |
| |
private function start():void | |
{ | |
Alert.show("hi maven!"); | |
} | |
]]> | |
</mx:Script> | |
| |
<mx:Button click="start()"/> | |
</mx:Application> |
Сборка проекта с помощю maven
для сборки проекта зайдите в папку [project-name] и выполните команду: mvn pakage
Клонирование объектов утилитой ObjectUtil.copy
Нам понадобилось клонировать объект. Для этого в as3 можно использовать утилиту ObjectUtil.copy. Метод ObjectUtil.copy(obj) возвращает копию исходного объекта obj. Это замечательно работает для невизуальных объектов.
Пример:
- package com.test
- {
- public class TestClass
- {
- public var index : int = 100;
- }
- }
- ...
- var testObject:TestClass = new TestClass();
- testObject.index = 98;
- var cloneTestObject : Object = ObjectUtil.copy(testObject);
- trace(“cloneTestObject.index : ” + cloneTestObject); // cloneTestObject.index : 98
- ...
Но есть ложка дегтя. Данная функция возвращает анонимный объект. И система не позволяет осуществить его приведение к исходному классу.
Данный код приведет к сбою в программе:
- ...
- var testObject:TestClass = new TestClass();
- testObject = 99;
- var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
- trace(“index: ”+ cloneTestObject.index);
- ...
После некоторых исследований и подсказки Константина Ковалёва, находим метод flash.net.registerClassAlias. Который и решает проблему:
- ...
- var testObject:TestClass = new TestClass();
- registerClassAlias(getQualifiedClassName(testObject), TestClass);
- var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
- ...
Для тех, кто хочет докопаться до сути процесса. В справке по registerClassAlias написано: «LocalConnection, ByteArray, SharedObject, NetConnection and NetStream are all examples of classes that encode objects in AMF.» Так как метод ObjectUtil.copy, использует ByteArray, то наш результирующий объект кодируется в формат AMF. Для восстановления класса объекта, используется функция flash.net.registerClassAlias.
Публичные переменные в классе flash.geom.Point
Дополнение к посту «Публичные переменные это зло… »
Постараюсь более подробно раскрыть проблему реализации системного класса flash.geom.Point.
Изучим структуру flash.geom.Point:
- var myTestPoint : Point = new Point(9,9);
- trace(describeType(myTestPoint));
в данные момент меня интересуют две строчки, которые говорят что свойства x, y класса flash.geom.Point, описаны как публичные переменные
…
variable name="x” type="Number”
…
variable name="y” type="Number”
…
какие проблемы это вызывает?
Отсутствует возможность переопределить данные свойства в классе потомке.
Пример 1:
- Point;
- public class MyPoint extends Point
- {
- public function set x (v:Number)
- {
- x = v;
- }
- }
- }
error: 1024: Overriding a function that is not marked for override.
Пример 2:
- package
- {
- import flash.geom.Point;
- public class MyPoint extends Point
- {
- public override function set x (v:Number)
- {
- x = v;
- }
- }
- }
error: 1023: Incompatible override.
Следовательно для реализации, например, интерфейса IPoint
- package
- {
- public class IPoint
- {
- function set x (v : Number) : void;
- function get x () : Number;
- function set y (v : Number) : void;
- function get y () : Number;
- }
- }
нельзя использовать использовать наследование
- public class MyPoint extends Point implements IPoint
придется использовать делегацию:
- package
- {
- import flash.geom.Point;
- public class MyPoint implements IPoint
- {
- private var _point : Point;
- public function MyPoint ()
- {
- _point = new Point();
- }
- public function set x (v:Number):void
- {
- _point.x = v;
- }
- public function get x ():Number
- {
- return _point.x;
- }
- public function set y (v:Number):void
- {
- _point.y = v;
- }
- public function get y ():Number
- {
- return _point.y;
- }
- …
- }
- }
Делегация в данном случае не оправдана, так как класс MyPoint нельзя будет использовать в методах работающих с Point. Вокруг стандартных методов придётся писать обёртки или использовать преобразование.
Пример преобразования:
…
- var Rect:Rectangle = new Rectangle(0,0, 100, 100);
- Rect.offsetPoint( new Point(myPoint.x, myPoint.y) );
…
Пример обертки:
- package
- {
- import flash.geom.Rectangle;
- import flash.geom.Point;
- public class MyRectangle extends Rectangle
- {