Вместо предисловия


Довольно много слышал о сборке flex проектов с помощью maven, но все как-то не доходили руки попробовать. С maven познакомился около года назад, когда попал работать в проект, бэк-енд которого собирался с помощью maven. Проект был гетерогенный: бэк-энд — java, пользовательский фрон-энд — flash, административный фронт-энд — java+js, бд — MySql. Исторически сложилось, что все это собиралось как-то. В один прекрасный день, было решено все это перевести на унифицированную сборку. Сразу скажу, что получилось с большими оговорками, но в конечном итоге сборку запускал именно maven. В java-мире использование maven уже почти стандарт, и, если следовать maven идеологии, все достаточно хорошо. В тот раз перевести флэш мне удалось через запуск ант-скрипта сборки. Теперь же, захотелось все попробовать по честному. Кому интересна данная попытка, прошу под кат.


Начал, конечно, с поиска плагинов, которые могли бы вообще просто собрать flex-проект. На первый взгляд их достаточно много, чтобы можно было повыбирать, но все оказалось несколько прозаичнее. Большинство проектов или уже заброшены или просто отсутствуют. В общем, потыкавшись в поиск, решил попробовать наиболее часто встречающийся. Это flex-mojos-maven-plugin. Здесь я немного заблудился, поскольку вариантов оказалось явно больше одного. Исторически, проект переводился с одних координат на другие, аналогично с репозиториями и исходниками. Самое неприятное в этот, что последующие проекты никак не ссылались на своих предшественников (в ресурсах можно посмотреть историческое развитие проекта, если интересно). В конце концов, была найдена последняя версия. Итак:

Попытка номер раз: net.flexmojos.oss v.6.0.0

Да, забыл упомянуть, что эксперимент проводился в IntelliJ IDEA, у которой есть поддержка и maven, и flex. Однако, это совершенно не принципиально, все тоже самое можно было сделать из командной строки.

Как оказалось IDEA по умолчанию знает архетип для net.flexmojos.oss v.6.0.0. В целом это был приятный сюрприз. Стандартная maven-генерация — clean compile — Fail. Получаем 4 ошибки:


[ERROR] The project FlexMojosTest:FlexMojosTest:1.0-SNAPSHOT (D:\Projets\FlexMojosTest\pom.xml) has 4 errors
[ERROR] Unresolveable build extension: Plugin net.flexmojos.oss:flexmojos-maven-plugin:6.0.0 or one of its dependencies could not be resolved: Failed to collect dependencies for net.flexmojos.oss:flexmojos-maven-plugin:jar:6.0.0 (): Failed to read artifact descriptor for net.flexmojos.oss:flexmojos-maven-plugin:jar:6.0.0: Failure to find com.adobe.flex:framework:pom:4.6.0.23201 in repository.sonatype.org/content/groups/flexgroup was cached in the local repository, resolution will not be reattempted until the update interval of flex-mojos-plugin-repository has elapsed or updates are forced -> [Help 2]
...


Которые вкратце сообщают о невозможности разрешить зависимости плагина, flex-фраймворка и всего, что с ним связано. Это был не самый ожидаемый результат. Поскольку разрешение зависимостей одна из сильных сторон maven. Проверка репозиториев показывает, что в самом деле, фреймворка с подобными координатами нет. Первая неудача.

Попытка номер два

Пробую создать аналогичный проект, но на основе описания от Adobe. Там используется более ранняя версия плагина org.sonatype.flexmojos v.4.0-RC2. Аналогичные действия по созданию проекта из архетипа mvn clean compile — Fail.
По большому счету, большой разницы в сообщениях об ошибках нет, снова не найдены зависимости для плагина. Правда, в этот раз другие.

Попытка номер три

Пробую еще вариант, описанный в рекомендация от IntelliJ IDEA. В нем используется версия v4.2-beta. Это последняя версия плагина в данной ветке, которая доступна в репозитории. Как ни странно, но это нехитрое действие приносит свои плоды и компиляция проходит успешно! Это первая удачная попытка без особых шаманских плясок с бубном.

Делая нехитрое преобразование через свойста, пробую перейти на последний flex-фраймворк, который есть в репозитории. При переходе на другую версию flex, необходимо так же перевести на нее и плагин, который используется. Подробнее о переходе можно узнать здесь. В общих чертах: крайне не рекомендуется смешивать несколько версий sdk в зависимостях, поэтому надо внимательно следить, чего именно подключается, а чего еще надо отключить.
В целом попытка удалась, спускаемся по жизненному циклу дальше — запускаем тесты и пакуем результат.

Запуск юнит-тестов

mvn clean test — Fail.
Первый запуск тестов провалился. Исходя из лога, не найден дебажный флеш-плейер. Приятно, что тут же в логе есть куда обратиться по этому вопросу. По ссылке из лога, кстати, это не самый последний вариант документации, узнаю, что надо явно указать путь к дебажному плейеру. Способов два: это добавить путь в системеную переменную PATH, или воспользоваться тайным свойством, который подхватит плагин. Мне ближе второе. Тем более, что потом можно будет сделать профайл для каждого разработчика, если потребуется. Пробуем, добавляем переменную с абсолютным путем к дебажному плейеру и получаем новую ошибку:

[ERROR] Failed to execute goal org.sonatype.flexmojos:flexmojos-maven-plugin:4.2-beta:test-run (default-test-run) on project FlexMojosTest: Invalid state: the flashplayer is closed, but the sockets still running...


Это явно прогресс, хотя и не самый лучший его вариант… При этом это ошибка именно плагина, потому как запуск этого теста через IDEA проходит успешно, что не может не радовать, поскольку никаких дополнител��ных настроек сделано не было. Точно не уверен, что именно повлияло на процесс, но переход на flexunit4 и написание «настоящего» теста полностью спасло ситуацию. Тест запустился и выполнился без лишних ошибок в логе!

Итак минимальная цель достигнута: mvn clean package работает!

Переход на «чистый» as3 проект

В последнее время я не часто делаю именно flex-проекты, все чаще это as3 проекты без использования mxml. Продолжаю приспосабливать проект под эти нужды. Для начала сменим названия, чтобы не было сомнений и заменим стартовый класс с mxml на as. В конфигурации плагина имеет смысл указать новый стартовый файл, потому как по умолчанию используется Main.mxml, а после его замены на Main.as потеряются возможности автозапуска флехи после сборки и типового дебага через IDEA, а это не очень приятно. Обращаю внимание, что необходимо специфицировать только название файла. По большому счету, можно не менять названия каталогов исходников и тестов, но мне как-то так приятнее.

Оптимизация

Проект не отличается обилием кода, но тем не менее весит в дебажной версии 853 б, в релизной 613. Проверим, чего можно достичь с использованием оптимизации от flexmojos. Судя по всему, оптимизация проходит в несколько этапов (я нашел в classes 4 файла, думаю, это и есть этапы оптимизации). После включения оптимизации для дебага получилось 391б, даже меньше релизной. Оптимизатор так же умеет сжимать картинки ресурсов, за это отвечает параметр quality конфигурации от 0 до 1. Скорее всего, это аналог качества jpeg.

Заметка К сожалению, так и не удалось перейти на последние версии плагина (net.flexmojos.oss), для 5 версии
не работает юнит тестирование, а для 6 не найден компилятор в репозитории (правда есть тулза, котороя вроде как позволяет мавенизировать любой flex-sdk ). Но даже с текущим фукнционалом уже очень не плохо.

Работа с fla-ресурсами

Разрешение зависимостей, это один из очень больших плюсов maven, когда они доступны в публичных репозиториях и проблема, когда нет. При разработке (особенно игр) много ресурсов хранять в свиках, получаемых из fla-проектов. Деплоить их каждый раз особого желания не возникает. А если свиков много, то вообще было бы удобно преобразовывать их пакетно. Что же можно найти здесь?
А вот здесь найти особо и не чего, к моему большому сожалению. Хотя Adobe и перешел на новый формат fla, который на самом деле зипованный xfl, но консольной утилиты компиляции этого добра в swc/swf до сих пор нет (и возможно не будет). Поиск дал несколько не сильно активных проектов, которые на текущий момент не могут быть даже рассмотрены в качестве альтернатив.

Итак, без FlashIDE скомпилировать ресурсы нельзя. Это расстраивает. Возможности которые есть:
  • jsfl — с его помощью можно отправить fla на публикацию во FlashIDE. Можно к этому добавить скрипт для размещения в maven-репозитории, тогда это не нарушит идеологии maven. Правда, получаем не переносимую конфигурацию скрипта, поскольку она завязана на абсолютные пути. Также, каждому работающему с проектом нужен FlashIDE. Не самое удачное решение, но хоть что-то. При активной работе с дизайнером, возможно проще сделать общий репозиторий и дать дизайнеру скрипт публикации свика, хотя, конечно, это не совсем работа дизайнера.
  • запуск компиляции fla через Ant или любым другим способом (например FlashDevelop).

Но все эти способы, по факту, несколько нарушают идеологию работы maven. Т.е. без дополнительных телодвижений, работать с дизайнером не получится.

Да, заодно про fla и контроль версий. Хоть теперь это и не бинарный формат, но мержить его все равно проблематично, потому как каждое сохранение вызывает довольно масштабные дифы, которые далеко не всегда мержатся в автоматическом режиме. Так что, тут выбор каждого. Если количество работающих с fla одновременно 1, то можно попробовать сэкономить на контроле версий и использовать xfl. Правда не думаю, что выгода будет сильно большая.

FlexPDM

Закончить хотелось бы плагином для определения качества кода. Нашел его случайно, когда искал возможность компиляции fla-файлов. FlexPDM — это opensource от Adobe, который базируется на аналогичном java проекте. Документация оставляет желать лучшего, вики не дописана и разбросана по проекту. Но найти страницу с использованием оказалось возможным. Также находил отзывы и примеры применения в реальных проектах. Как обычно, взял последнюю версию (1.2) плагина из адобовского репозитория: mvn site — Fail (даже как-то стал привыкать к этому результату)

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) on project FlexMojosTest: Execution default-site of goal org.apache.maven.plugins:maven-site-plugin:3.0:site failed: An API incompatibility was encountered while executing org.apache.maven.plugins:maven-site-plugin:3.0:site: java.lang.AbstractMethodError: com.adobe.ac.pmd.maven.FlexPmdReportMojo.canGenerateReport()Z


Вот такая неприятность. Небольшой поиск показал, что этот плагин в последней версии не работоспособен. Пробуем откатиться на несколько версий назад и это не помогает. В целом это логично и объяснение есть здесь.
Еще немного порывшись в гугле, нашел репопозиторий Alex Manarpies, в котором тоже есть версия 1.2 плагина, чуть более поздняя. Зачищаю локальный репозиторий, меняю реп — mvn site

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) on project FlexMojosTest: failed to get report for com.adobe.ac:flex-pmd-maven-plugin: Plugin com.adobe.ac:flex-pmd-maven-plugin:1.2 or one of its dependencies could not be resolved: Failed to read artifact descriptor for com.adobe.ac:flex-pmd-maven-plugin:jar:1.2: Could not transfer artifact com.adobe.ac:flex-pmd-maven-plugin:pom:1.2 from/to flexpmd.opensource.adobe (http://code.google.com/p/flex-maven-repo/source/browse/): Checksum validation failed, expected <!DOCTYPE but is d3ea07a9bcf449ba69929ed4b6c01bdf7b1b9b6d -> [Help 1]


Скачивание не удалось. Последняя попытка работы со снапшотом плагина для версии 1.3 также не удалась.

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.0:site (default-site) on project FlexMojosTest: failed to get report for com.adobe.ac:flex-pmd-maven-plugin: Plugin com.adobe.ac:flex-pmd-maven-plugin:1.3-SNAPSHOT or one of its dependencies could not be resolved: Failed to read artifact descriptor for com.adobe.ac:flex-pmd-maven-plugin:jar:1.3-SNAPSHOT: Failure to find com.adobe.ac:flex-pmd:pom:1.3-SNAPSHOT in repository.sonatype.org/content/groups/flexgroup was cached in the local repository, resolution will not be reattempted until the update interval of flex-mojos-plugin-repository has elapsed or updates are forced -> [Help 1]


Однако, радует, что какая-то работа видимо ведется. Или велась. Однако, кроме мавена, этот проект работает:
Любителям flashdevelop
Jenkins+Ant — приме�� сборки

Вместо заключения

Собитать flex проекты мавеном можно, особенно если это проекты модульные и команда большая. Очень желательно иметь свой репозиторий, с которым будет работать команда. Если проект гетерогенный, особенно с java бэк-ендом, то сборка будет еще лучше. Но для небольших распределенных команд, проектов игростроя, где много работы дизайнера, настройка проекта не настолько проста, как бы хотелось. Проблема кроется в одной из сильных частей maven — разрешение зависимостей. Репозиториев, точнее артефактов в них, пока не много и они не согласованы. Maven пока еще не очень популярен в среде flex/flash (особенно) разработчиков. Несколько огорчает подход Adoby, который скорее не поддерживает maven сборку, чем поддерживает. А ведь жаль, чертовски удобная штука.
Проект, на котором проводились эксперименты, там же есть черновик статьи, который писался по ходу действия. По дифам можно посмотреть, что именно и когда добавлялось.

Ресурсы.


FlexMojos.

Самая старая версия из найденных. Последнее обновление — февраль 2009
Версия до 4.0 еще org.sonatype.flexmojos. Последнее обновление — май 2011
Версия до 6.0.0. Самая полная документация. Последнее обновление — ноябрь 2012 По большому счету, в последней ссылке я нашел практически копии всех предыдущих варинантов документации, так что в первых двух смысла не много, но найти их значительно легче, чем последнюю.

Первый архив вопросов-ответов из google-group
Второй архив вопросов-ответов из google-group

Первая статья от Adobe по flexmojos v.4.0-RC2
Вторая статья от Adobe по flexmojos v.4.0-RC2
Третья статья от Adobe по flexmojos v.4.0-RC2

Справка от IntelliJ IDEA по работе с flexmojos v.4.2-beta

Документация по версии 4.0
Параметы конфигурации для версии 4.0

Appach flex wiki — maven plugin

FLA/XFL

XFL и контроль версий. Проблемы.
Ant tasks для сборки проекта с использованием Flash CS. 2009 год
Ant task для работы с ресурсами, без их компиляции. 2012 год
Mike Chambers flashcommand — фактически генератор jsfl-скрипта

FlexPDM

Adobe cookbook
Wiki — how to invoke FlexPDM
FlexPDM maven plugin broken

Alex Manarpies repository