Вместо предисловия
Довольно много слышал о сборке 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:ProjetsFlexMojosTestpom.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 http://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 http://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
Автор: nikolay_atamanyuk