Ответ на #1082378 и #1082383 А разве форк @develar куда-то пропал? Там по-прежнему все в шоколаде, и для 4 версии flexmojos тоже есть и форк, и соответствующий вменяемый шоколадный (без орехов) super pom. Версия 4.0-de1, ну а super pom смотрите flyti.org:8081 (сейчас актуальная версия 22) У вас только возникнет проблема откуда брать SDK — пинайте @develar и будет опубликована нужная вам версия.

Ну в общем переход от форка develar на стандартную ветку (4.0-beta-2) принес ряд неприятностей.

Во-первых, пропала возможность класть css, png и прочие ресурсы в папку resources. Компилятор тогда их упорно не видит, и никакие includeSource не помогают. Приходится ложить все это в src папку, прямо вместе с кодом. Только тогда оно работает.

Во-вторых, традиционно мы выносим все такие ресурсы в отдельный swc модуль. Это существенно ускоряет компиляцию других модулей. На форке develar никаких проблем не было, вcе эти файлы попадали внутрь swc. На стандартном форке туда попадает только код. А для ресурсов нужно явно указывать опции компилятора.

И вот с этими опциями проблема:
<includeFiles>
<scan>
<includes>
<include>${basedir}/src/main/flex/*.css</include>
<include>${basedir}/src/main/flex/fonts/*.ttf</include>
</includes>
</scan>
</includeFiles>
В упор не работает, выдает
[ERROR] Failed to execute goal org.sonatype.flexmojos:flexmojos-maven-plugin:4.0-beta-2:compile-swc
(default-compile-swc) on project common: java.lang.reflect.InvocationTargetException:
NullPointerException -> [Help 1]

Это работает:
<includeStylesheets>
<stylesheet>
<name>Fonts.css</name>
<path>${basedir}/src/main/flex/Fonts.css</path>
</stylesheet>
</includeStylesheets>
Fonts.css послушно попадает в swc, попадают и файлы фонтов tff, на которые ссылается Fonts.css
Все это видно из других модулей и работает.

Но вот нюанс, я не хочу держать Fonts.css в корне src. Я хочу, чтобы было css/Fonts.css. И с этим облом:
Error: A file found in a source-path must have the same package structure 'css', as the definition's package, ''.
Компилятор бьет себя пяткой в грудь, что для класса Fonts.css нужен пакет css, а не дефолтный, пустой. Я бы и рад задать пакет, да только как это сделать в css файле? :)

Ну что ж, результат на выходе такой, какой надо. Да только все эти приколы радости не доставляют.

Параметр directory для compc не зачищает старый out — directory '/Users/develar/bar/foo-4.1-1.0-SNAPSHOT.swc' is not empty" . И во flexmojos нет никакого workaround. И flexmojos не поддерживает для mxmlc возможность включения файлов по маске (идиоты в Adobe и прочие следующие тому же порнографическому пути используют для этого фейковый класс типа FrameworkClasses с "This class is used to link additional classes"). В реальной жизни это (включение в swf всего source root) мало нужно, но если мы потом хотим распотрошить swf на abc, писать каждый класс в includes лениво — нужно будет как-нибудь доработать эту логику во flexmojos (в идеале сам компилятор, но Adobe патчи не принимает).

flex conditional compilation + возможность указать классификатор во flexmojos позволяет нам легко сопровождать несколько версий библиотеки для, к примеру, разных версий флекса. Вот только тут у вас есть два пути — вы можете создавать отдельную директорию для модуля, но это же мавен — youtrack.jetbrains.net

Да, переименовываем pom.xml в pom-4.1.xml и pom-4.5.xml, оставляем в них только defines и добавляем classifier, а все общее выносим в создаваемый в этой же директории parent-pom, ну а потом строчку yourModuleName меняем на две (как по ссылке выше) с указанием полного пути к соответствующему pom. То есть эта фича мавена позволяет нам уйти от порнографии с созданием еще одной директории с указанием использовать source root из другой. Есть только минус — IntelliJ IDEA это не поддерживает. Ну, к 10.1 они дай бог допинают, ну а пока можно, грустно на нее смотря, после import указать ее на фейковый pom.xml (link -s) и поправить путь к flex-config-report.

Теперь за интеграцию flexmojos с IntelliJ IDEA мне платят и делаю я это в рабочее время (если можно назвать рабочим днем воскресенье ;)).

То, что сделал Марвин с архитектурой 4 версии flexmojos, просто awesome, и плевок в сторону клинических идиотов в Adobe. С новой архитектурой flexmojos сделать конфигуратор для IDEA очень легко и оно очень, очень maintainable (так maintainable, что конфигуратор будет даже поддерживать мой форк, хотя и ничего о нем не зная). Adobe послана с их убогим compiler api и этому убожеству отдается набор args (String[]). Эх, что они там на max говорили о новом компиляторе — пусть нанимают Марвина, у них самих вряд ли выйдет что-то путное.

Марвин "made an extension point for flexmojos that will allow you to generate whatever IntelliJ needs at same time it will kept you independent from flexmojos and flexmojos won't need to push unwanted goals to it's code base", поэтому встречайте расширение для flexmojos github.com :) Это не утвержденный пока еще плагин и не до конца утвержденные координаты, и на неделе мы еще обсудим как лучше все это заинтегрировать в idea, но если что — уже можно пользоваться (вполне вероятно, что оно будет на лету инжектироваться в проект (то есть вы об этом и знать не будете), а сами классы расширения будут в плагине флекса, то есть ничего, описанного ниже, делать не придется).

Можете для использования обновиться до версии 20 моего flex super pom repository.flyti.org или же посмотреть в нем же секцию конфигурирования —

<plugins>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>${flexMojos.version}</version>
<extensions>true</extensions>
<dependencies>
<dependency>
<groupId>com.adobe.flex</groupId>
<artifactId>compiler</artifactId>
<version>${fdk.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.intellij.flex.maven</groupId>
<artifactId>flexmojos-idea-configurator</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

<configuration>
<configurator>com.intellij.flex.maven.IdeaConfigurator</configurator>
</configuration>
</plugin>
</plugins>

Одним из плохих нововведений во flexmojos 4 стала автоматическое исполнения всякой ерунды типа генерации документации/отчетов/rsl по умолчанию. То есть при install он и rsl сделает и документацию и прочее. А оно даром не нужно. Должно быть наращивание, а не исключение — ленивые товарищи пишут super POM и радуются жизни.

Поговорили с Марвином о моем форке и о интеграции с IDEA в свете выхода maven 3/flexmojos 4. Интеграцию я сделаю на этих выходных, ну а по форку вот что:

some changes you introduced simple lead flexmojos into a Convention w/o Configuration scenario... which I can't accept on the main stream

and ok, with your changes, how do I produce an SWC that only includeFiles?

Транзитивность в 4 есть. Так что если вам нужны плюшки — можете юзать мой форк (я уже запушил github.com , но не задеплоил еще). Если же плюшки от непонятно кого вам не дороги, а дорога репутация официальной ветки — рекомендую юзать официальный flexmojos. Хотя я могу сказать, что в моем форке, как это заметил Марвин Convention w/o Configuration scenario — сами понимаете, какова прелесть плюшки на таком фундаменте.

Трава в Бразилии ммм... Марвин в 4 версии flexmojos использовал интересную штуку — интерфейсы типа ICompilerConfiguration, IMxmlConfiguration (их реализуют соответствующие заклинания) генерируются при компиляции посредством анализа соответствующих классов убогого компилятора флекса. Мой форк теперь, так как Марвин отказался от устаревшего SVN в пользу DVCS на github.com <github.com> — github.com (я пока не запушил итоговый результат портирования форка на ветку 4 официальную).

Но форк мой теперь ну совсем для эстетов — плюшки только, ну а транзитивность да — она есть в 4 flexmojos из коробки. Интеграция с IntelliJ IDEA будет выполнена для официальной ветки, в силу понятных причин.

Марвин спросил меня в вежливой форме, когда же, черт возьми, я запилю поддержку flexmojos 4 в IDEA. Он уже даже написал entry point. В силу определенных причин, время на это у меня будет только после 5 ноября.

@yelbota , касательно чистого без флекса проекта — таки есть нюанс, что он компилировать будет только мавеном, а сама idea в fcsh требует указания во flex config <theme></theme>. Просто я никогда не собирал в IDE такие проекты :) Я учту этот нюанс в 4 версии, ну а пока что, если будет сильно мешать, я могу и версию 3.8-de3.2 выпустить :)

опубликован FDK 4.5.0.17836. flexmojos 3.8-de3.1, обновлены forge&super poms. обратите внимание на новые координаты playerglobal (для работы с чистым проектом без флекса) и tlf (для легкого обновления). так как я идиот, нормальной статьи о сборке проектов без флекса, а также проблемы сборки с библиотеками собранным для разных мажорных версий флекса пока что не будет. патч flexmojos 4 для его использования (официальный flexmojos 4 сейчас по уровню интеграции с IDEA равен уровню flexmojs 2 до момента моего сотрудничества с Jetbrains) будет выполнен до конца октября, к этому же времени и будет эта статья с описанием этих нюансов.

Если пересилю боязнь белорусских милиционеров, то, может быть, надо приехать на bafpug ;)

вместо #930448 и #930479 просьба писать "@develar идиот, который вот уже третью неделю не задокументирует версию и fdk дескриптор для решение означенных проблем" — это будет правильнее, потому что на самом деле означенных проблем нет.

На сегодняшний день единственное, что меня напрягает во flexmojos, это отсутствие возможности нормально работать с чистыми AS3 модулями, без дурацких зависимостей от flex sdk

unable to open './themes/Spark/spark.css'

Вот казалось бы, какой, нафиг, spark.css, если у меня проект на flex 3.5? А вот фиг там, preloader я переключал на 4й флекс, чтобы он собирался под targetPlayer 10, а не 9. Из-за него, что ли?

Теперь mvn compile работает, а билд из IDE нет. И все из-за набора адобовских косяков — лечишь один, вылезает другой.

И что теперь? Выкинуть модуль прелодера из проекта?

А в целом, смотря на flexmojos 4, грустно. Я боюсь классов более 2000 строк. Боюсь. Я люблю обращаться с кодом как с team, где каждый аспект функциональность представлен отдельной сущностью, выраженной, в рамках языка Java, отдельным классом — чтобы я мог, размышляя, оперировать ими как именами любимых девушек в мечтах, а не безликими контейнерами для функций. Отставя в сторону лирику, два вопроса: 1) как присылать маленький удобный патч для god-классов? 2) как тестировать god-классы?

Нашел один серьезный недостаток. Когда мы делаем чистую AS3 библиотеку, опирающуюся только на API флэш плеера и не зависящую от флекс фреймворка, в пом эту зависимость все равно приходится указывать. А потом получившийся swc нельзя использовать в проекте, где другая версия флекс фреймворка. Хреново.

Частичный ответ на juick.com

> Репозиторий может исчезнуть
> Хостится на корпоративном сервере
Замените адрес на repository.flyti.org (dns кеш еще может не обновиться, если что, ip 178.79.136.124, то есть в hosts "178.79.136.124 repository.flyti.org <repository.flyti.org>> flyti -> your proxy). Если у вас есть такой прокси — просто добавьте в ваш repository manager repository.flyti.org как Proxy Repository (c Download Remote Indexes, они доступны), если же нет — то вот примерный settings.xml flyti.org (в идеальном мире все артефакты лежат в central, но из-за лицензионных ограничений получается что нам нужно указывать дополнительные источники — в случае прокси вся работа по поиску будет выполняться один раз и с использованием индексов, а без прокси мавен будет дергать каждый репозиторий в списке сам — каждый раз и без индексов). Честно проверил — удалил весь свой локальный репозиторий и с этим settings.xml собрался :) (кстати, вес всего того, что потребовалось для сборки — 98,4 MB).

Почему в flyti.org указан только один репозиторий, а выше говорилось о "Все общеизвестные вы должны указать вручную"? Потому что если вы только и только flex-разработчик, то вам ничего больше и не нужно, иначе захочется central/Apache/Codehaus snapshots и прочего ;)

> разработчик может заинтересоваться другой технологией и бросить его, не обеспечив синхронизацию с новыми фичами основной ветки итд.различия не фундаментальны на уровне POM, совместимость сохранена, для перехода на официальную версию вам надо будет написать вручную все транзитивные зависимости.

> Несерьезный статус проекта. Его, фактически, вообще никакого нетда :) проект пишется не для того, чтобы показать себя миру, а как решение своих конкретных проблем — если кто-то сталкивается с такими же — то, пожалуйста, я всегда за MIT, берите и используйте. При вашей адекватности (то есть дадите мороженое как @ilja-panin) вас не оставят наедине с git clone.

> Неизвестна лицензия, статус исходных кодов.Apache License, Version 2.0 была и есть.

> Нет необходимых атрибутов типа листа рассылки для решения вопросов.juick.com <juick.com>>> Нет документации.
и, очевидно, не будет в ближайшее время.

Есть такая штука в моем форке — транзитивность :) Вопрос — а надо ли указывать зависимость от flex-framework, если мы и так указали зависимость от некой swc, и так зависимой? А air-framework? Черт, указывать лениво, а ошибка есть — Multiple Player/AIR Global dependencies. [com.adobe.flex.framework:airglobal:swc:4.1.0.17115:compile, com.adobe.flex.framework:playerglobal:swc:10:4.1.0.17115:compile]

Это первый поправленный момент в 3.8-de1.

Второй момент — касательно вопроса о target-player. Нет никакой разницы какой вы установите. Хоть 89. Все зависит от airglobal (а какой он, это зависит от используемой версии sdk). Можете проверить сами, указав airglobal вместо playerglobal и --target-player=89 Поэтому не беспокойтесь о значении target-player — любое значение указанное вами будет проигнорировано, а в дампе конфигурации будет некое значение на выбор компилятора.

В тему #848588/1 "Ты используешь вилку от Девелара или официальную версию?" Дайте посмотреть на того, кто будет использовать официальную версию, которая не поддерживает транзитивность, на проекте с 20+ swc/swf в здравом уме. Написать POMs без транзитивности вы еще сможете, но как же вас заколебает поддерживать все эти простыни.

Эх, приятно знать как оно работает и откуда что берется :) Приятно, что факапы, непонимания и неожиданности закончились. Понятный и предсказуемый тул.

Уж постараюсь, чтобы не только мне был понятный :)

Наконец упаковка AIR приложения с помощью Flexmojos работает из коробки yzh44yzh.com

Спасибо @develar за быструю реакцию, и вообще за форк )

Следующая статья будет про RSL и swz. Потом начну переписывать прежние статьи, чтобы каждая была актуальна, и чтобы в каждой был zip с проектом, работающим из коробки.

Какие еще темы по работе с flexmojos нужно осветить? Принимаю заявки )

3.8-de0

* синхронизировано с официальной веткой, опция includeAsClasses теперь доступна.
* отключено предупреждение flexmojos о "Source file was not defined, flexmojos will guess one." Не надо указывать Source file, не надо.
* параметр staticLinkRuntimeSharedLibraries удален, я его deprecated еще в 3.3, так что используйте rslScope
* параметр loadExterns удален. я не убедил Марвина и он так и не удалил из официальной версии его — пользуйтесь dependency with type "xml" and classifier "link-report" Почему? Потому что dependency работает в мультимодульном проекте, а loadExterns нет. Я делал это в рамках поддержки IntelliJ IDEA — loadExterns всегда будет адресоваться на репозиторий, а не на проект.
* параметры configFile, defines, locales, mergeResourceBundle удалены (они тоже были помечены как deprecated, поэтому совесть не мучает)
* docs.sonatype.org

Для обновления с моим Super POM:

<properties>
<flexMojos.version>3.8-de0</flexMojos.version>
</properties>

Но все было затеяно с одной целью — @yzh44yzh верно заметил и спросил — как же паковать иконки в AIR приложение? Синхронизация с официальным flexmojos дала результаты — наконец-таки заклинание это работает без допиливания (то есть пилить пришлось, но уже другой ;) аспект), поэтому вот вам тестовый проект с иконками — files.me.com , играйтесь с параметрами includeFiles/includeFileSets. Черт возьми, я так и не понял юмора в коде с реализацией такого же поведения как и для SWC — запаковать все в AIR из resources. Несмотря на то, что по текущему коду все так и как бы есть — при пустых includeFiles/includeFiles берется все resources — оно будет работать только в моем форке (keystore и descriptorTemplate будут выкинуты, не беспокойтесь). Проще говоря — просто обновитесь, киньте ваши иконки в src/main/resources и все.

Касательно почему у артефакта adt разная версия с Flex SDK — это не ошибка, adt не идет с каждой новой публикуемой (не Adobe, а мной в maven репозиторий) версий FDK. Смотрите мой Super POM. Он обновляется только лишь когда AIR Team интегрируется с Flex Team, копируя новую версию AIR — было бы не смешно качать этот артефакт каждый раз по новой. Но, вообще, это Марвин первым ввел такую вот загогулину ;)

И да, о сертификате — прошу прощения за внесение неточности с моей стороны, что привело к неправильному пониманию yzh44yzh.com "Файл сертификата можно назвать как угодно, но во flexmojos имя жестко зашито имя sign.p12 и flexmojos будет искать сертификат в папке resources. Так что именно так мы и генерируем. (Кстати, такая жесткость со стороны flexmojos не очень хороша. Может статься, что сертификат нельзя хранить в проекте, где он доступен всем, кому доступен проект.)" Ребята, да ведь мы же не Adobe, нас запинают свои же, — для этого есть keystore (default-value="${basedir}/src/main/resources/sign.p12") и storetype (default-value="pkcs12") (но, сам я не пользуюсь особо этим — сказать, можно ли цеплять сертификат из mac os x keychain не могу).

Отличная фраза о идиотах в Adobe в комментариях к коду — Ideally Adobe would have used some parseable token, not a huge pass-phrase on the descriptor output. They did prefer to reinvent wheel, so more work to all of us. I wonder why people has to be so creative, what is wrong with using something similar to what the rest of the world uses?! Весь flexmojos пропитан хаками, чтобы заставить тупое и убогое compiler API дать результат.

@ilja-panin, а требование "flex-mojos должен быть "официальный", ни каких форков и сборок от Васи." по-прежнему в силе, или таки можно яблочный сок вместо мороженого ;)?

с этого момента артефакт textLayout будет находиться в groupId flashx.textLayout и версией соответствующей его build info — а не в groupId от FDK и не с версией от FDK. Это сделано для удобоства и чтобы вы могли легко подключить ночную сборку напрямую от TLF Team. Иначе тоже возможно заменить, но это требует ряда телодвижений нетривиальных. Единственное, как это может затронуть ваши POMs, если вы использовали его как RSL — обновите groupId на flashx.textLayout (предполагаю, что вы в курсе, что в моем форке и с моим super POM версии для артефактов FDK не надо — они все и так указаны в dependencyManagement, то есть version у вас не указываются — если же таки указано — просто удалите :)).

Обсуждение, отлично иллюстрирующее отношение пользователей (читай хомяки — но меня разок поправили, поэтому пишу пользователи) к мавену и его проблемы — juick.com С одной стороны — мы (авторы инструмента) все в белом — какого черта пользователь-идиот не ставит параметры конфигурации и еще обвиняет нас в чем-то, с другой, какого черта пользователь должен что-то там еще дописывать, если он уже и так все сказал — "соберите мне эту cssовину".

Казалось бы, все однозначно — авторы берут в зубы молоток и ваяют. Однако, не все так просто. За 2 года использования flexmojos на реальном большом проекте (не ради блага людей являюсь контрибьютором) я ни разу с этим столкнулся. Почему? Потому что в наших CSS файлах мы используем не только Flex SDK, но и собственные библиотеки. Поэтому у нас defaultScope для таких вот модулей и так выставлено в external. Общего и универсального решения быть не может — для решения проблемы нам необходимо считать библиотеки из Flex SDK как external для CSS, а все остальные с текущей (то есть как для просто app) политикой. А политика external для всего (defaultScope=external) по умолчанию не катит — возмутятся те пользователи, что указывают в CSS классы из своих библиотек. Короче — в моем форке ситуация сейчас останется как есть и ничего исправляться не будет — как будет время, проблема будет обсуждена с Марвином и что-нибудь будет сделано — хомячки наше все.

Задумал я тут вынести фонты (да и вообще стили) в отдельный swf файл, загружаемый в рантайме как описано здесь: livedocs.adobe.com

Оказалось, что flexmojos сильно смущает тот момент, что я указываю Fonts.css как главный класс приложения :) Настолько сильно, что он выбрасывает NullPointerException и сдается.

Ну не беда, можно собрать этот модуль баш-скриптом

#!/bin/bash
cd /home/yura/p/fourthday/fonts/src/main/resources
/home/yura/dev/flex_sdk_4.0.0.14159/bin/mxmlc Fonts.css
mv Fonts.swf /home/yura/www/fourthday/swf/fonts.swf

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