Внедряем Flexmojos в рабочий процесс.

Getting Stated

Для начала весьма неплохо было бы загрузится теорией. В книге Maven: The Definitive Guide стоит прочитать главы 1-11 ( но можно и все :) и главу 17, посвященную именно flexmojos. Правда эта глава местами устарела, и код, данный там, не работает.

Далее неплохо бы заглянуть на сайт Flexmojos, прочитать getting started, ну и все остальное, что там есть :) Вот этот gettings stated работает из коробки. Но он тож чутка устарел, и использует flex sdk версии 3.2 А поскольку нам нужны будут версии 3.5 и 4.0, но код мы напишем другой.

Далее устанавливаем Maven. Скачиваем последнюю версию и действуем согласно инструкциям для вашей ОС, прочитанным во 2й главе Maven: The Definitive Guide. Если у вас линукс, то может возникнуть желание установить Maven с помощью yum или apt-get. Не стоит, ибо будет установлена устаревшая версия, не поддерживающая Flexmojos.

Вот теперь можно воспользоваться инструкциями с сайта flexmojos и убедиться, что все работает :) Потом можно скачать пример мультимодульного java-flex проекта, поднять его у себя и запустить.

Создаем проекты

Допустим у нас есть два проекта. Один проект содержит несколько библиотек общего назначения, которые будут использоваться в других проектах. Назовем его CommonLibs. Другое проект -- конечное приложение, но он тоже состоит из нескольких модулей. Назовем его MyCoolApp.

Нам нужно будет создать файл настроек Maven ~/.m2/settings.xml, корневые pom.xml для обоих проектов, и pom.xml для каждого модуля внутри этих проектов. Еще есть такая штука, как flex super pom. Но поскольку мне было недосуг с ним разобраться, то у меня его нет, и в моих примерах его не будет.

В файле ~/.m2/settings.xml нам нужно прописать пути к репозиториям Maven, откуда будут браться артефакты. По хорошему это должен быть Nexus-сервер в локальной сети вашей компании. Но про Nexus мы будем говорить позже. Стандартные репозитории Maven нам тоже не подойдут, ибо там нет flexmojos. На сайте flexmojos предлагают использовать вот этот репозиторий: http://repository.sonatype.org/content/groups/flexgroup/ Пока будем следовать этой рекомендации. И settings.xml будет выглядеть так:


<settings>
<profiles>
	<profile>

		<id>flex-mojos</id>
		<repositories>
			<repository>
			<id>flex-mojos-repository</id>
			<url>http://repository.sonatype.org/content/groups/flexgroup/</url>

			<releases> <enabled>true</enabled> </releases>
			<snapshots> <enabled>false</enabled> </snapshots>

			</repository>
		</repositories>
		<pluginRepositories>
			<pluginRepository>
			<id>local</id>

			<url>http://repository.sonatype.org/content/groups/flexgroup/</url>
			<releases> <enabled>true</enabled> </releases>
			<snapshots> <enabled>false</enabled> </snapshots>

			</pluginRepository>
		</pluginRepositories>
	</profile>
</profiles>
<activeProfiles>
	<activeProfile>nexus</activeProfile>

</activeProfiles>
</settings>

Здесь мы создаем единственный профайл flex-mojos, указываем в нем используемый репозиторий и делаем этот профайл активным по умолчанию.

Теперь создадим проект CommonLibs. Запускаем IDEA, Create New Project, Create Project from scratch.

  • Диалог New Project.
  • Name: CommonLibs
  • Project Files Location -- как хотите, у меня по дефолту
  • Create Module -- checked
  • Module Settings -- все как есть по дефолту
  • Select Type -- Maven Module
  • Next
  • Шаг второй.
  • Group Id: com.mycompany.CommonLibs
  • Artifact Id: CommonLibs
  • Version: 1.0
  • Create from archetype -- в списке выбираем архетип flexmojos-archetypes-application (он там в самом низу).
  • Finish.

Получаем такой проект:

- CommonLibs/
  - .idea/
  - src/
  - CommonLibs.iml
  - pom.xml

src в корневом модуле нам не нужем, сразу удалим его. Заглянем в pom.xml, полюбопытствуем. Здесь мы узнаем, что автор проекта flexmojos -- Marvin Herman Froeder В этом файле нам все понятно, ведь мы уже прочитали 11 глав Maven: The Definitive Guide, правда ведь? :) Ну если вдруг не прочитали, то надо прочитать прежде, чем двигаться дальше.

Если вас устравивает, что этот pom ориентирован на использование flex sdk 3.2, то можете его использовать. Но нет, вас это, конечно, не устраивает. Нужен flex sdk 3.5 или 4.0. Будем вносить изменения в pom.

Меняем packaging с swf на pom, ибо это корневой pom и сам по себе он не определяет компилируемый артефакт.


<groupId>com.mycompany.CommonLibs</groupId>
<artifactId>CommonLibs</artifactId>
<version>1.0</version>
<packaging>pom</packaging>

Добавим парочку свойств:


<properties>
	<fdk.version>3.5.0.12683</fdk.version>
	<fp.version>9.0.124</fp.version>
</properties>

Очевидно, это для проекта на flex sdk 3.5 Для 4.0 напишем так:


<properties>
	<fdk.version>4.0.0.12575</fdk.version>
	<fp.version>10.0.0</fp.version>
</properties>

Заменяем узел build, он будет выглядеть вот так:


<build>
	<sourceDirectory>src/main/flex</sourceDirectory>
	<testSourceDirectory>src/test/flex</testSourceDirectory>

	<pluginManagement>
	<plugins>
		<plugin>
			<groupId>org.sonatype.flexmojos</groupId>
			<artifactId>flexmojos-maven-plugin</artifactId>

			<version>3.5.0</version>
			<extensions>true</extensions>

			<dependencies>
				<dependency>

					<groupId>com.adobe.flex</groupId>
					<artifactId>compiler</artifactId>
					<version>${fdk.version}</version>
					<type>pom</type>

				</dependency>
			</dependencies>
		</plugin>
	</plugins>
	</pluginManagement>
</build>

Здесь мы заменили version и добавили блок dependencies, где явно указали артефакт com.adobe.flex:compiler нужной версии.

Ниже в блоке dependencies мы видим две зависимости от артефактов com.adobe.flex.framework:flex-framework и org.sonatype.flexmojos:flexmojos-unittest-support. Для первого артефакта меняем версию. Вместо 3.2.0.3958 пишем ${fdk.version}. Второй артефакт вообще убираем -- он устарел. Вместо него добавляем com.adobe.flexunit:flexunit и com.adobe.flexunit:uiRunner.

В итоге блок dependencies для проектов fdk3.5 будет выглядеть так:


<dependencies>
	<dependency>
		<groupId>com.adobe.flex.framework</groupId>

		<artifactId>flex-framework</artifactId>
		<version>${fdk.version}</version>
		<type>pom</type>
	</dependency>

	<dependency>
		<groupId>com.adobe.flexunit</groupId>
		<artifactId>flexunit</artifactId>
		<version>4.0-rc-1.1</version>

		<type>swc</type>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>com.adobe.flexunit</groupId>

		<artifactId>uiRunner</artifactId>
		<version>4.0-rc-1.1</version>
		<type>swc</type>
		<scope>test</scope>

	</dependency>
</dependencies>

А для проектов fdk4.0 так:


<dependencies>
	<dependency>
		<groupId>com.adobe.flex.framework</groupId>

		<artifactId>flex-framework</artifactId>
		<version>${fdk.version}</version>
		<type>pom</type>
		<exclusions>

			<exclusion>
				<groupId>com.adobe.flex.framework</groupId>
				<artifactId>playerglobal</artifactId>
			</exclusion>
		</exclusions>

	</dependency>
	<dependency>
		<groupId>com.adobe.flex.framework</groupId>
		<artifactId>playerglobal</artifactId>
		<version>${fdk.version}</version>

		<classifier>10</classifier>
		<type>swc</type>
	</dependency>
	<dependency>
		<groupId>com.adobe.flex.framework</groupId>

		<artifactId>sparkskins</artifactId>
		<version>${fdk.version}</version>
		<type>swc</type>
		<scope>theme</scope>

	</dependency>
	<dependency>
		<groupId>com.adobe.flexunit</groupId>
		<artifactId>flexunit</artifactId>
		<version>4.0-rc-1.1</version>

		<type>swc</type>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>com.adobe.flexunit</groupId>

		<artifactId>uiRunner</artifactId>
		<version>4.0-rc-1.1</version>
		<type>swc</type>
		<scope>test</scope>

	</dependency>
</dependencies>

Теперь можно запустить mvn install, чтобы убедиться, что все ок. Можно запустить из консоли, но раз уж мы все делаем в IDEA, то открываем панель Maven Projects, в ней открываем проект CommonLibs Flex, lifecycle, запускаем install.

Наблюдаем BUILD SUCCESSFUL и радуемся. (Если не наблюдаем, то унываем и идем курить маны и терзать гугл :)

Ну вот, проект есть, но от него пока нет пользы. Пора добавлять модули. Пусть у нас будет две библиотеки. Первая -- SuperLib -- умеет складывать числа. Вторая -- MegaLib -- умеет умножать числа :)

  • File->New Module, диалог New Module, Create module from scratch. Next
  • Name: SuperLib, Select type: Maven Module, Next
  • ArtifactId: SuperLib, create from archetype: flexmojos-archetype-application, Finish

Появляется модуль с такой структурой:

- CommonLibs/
  - SuperLib/
    - src/
      - main/
        - flex/
          - Main.mxml
        - resources/
      - test/
        - flex/
    - pom.xml
    - SuperLib.iml

test/flex/... -- тут сгенереный класс для юнит-тестов, пока удалим это. Main.mxml тож удалим.

Откроем pom.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/maven-v4_0_0.xsd">
	<parent>
		<artifactId>CommonLibs</artifactId>
		<groupId>com.mycompany.CommonLibs</groupId>

		<version>1.0</version>
	</parent>
	<modelVersion>4.0.0</modelVersion>

	<artifactId>SuperLib</artifactId>

	<packaging>swc</packaging>

	<build>
		<plugins>
			<plugin>
				<groupId>org.sonatype.flexmojos</groupId>

				<artifactId>flexmojos-maven-plugin</artifactId>
				<configuration>
					<configurationReport>true</configurationReport>
				</configuration>
			</plugin>

		</plugins>
	</build>

</project>

Тут ссылка на родительский артефакт, имя текущего артефакта, packaging swc, ибо библиотеку мы будем компилировать в swc. Блок build нужен, чтобы указать настройку configurationReport=true. Она обязательно нужна, чтобы Maven сгенерил настройки проекта для IDEA, которые потом будут использоваться при компиляции через стандартный Make, а не через mvn install.

Пока вы будете редактировать pom файл, IDEA будет показывать вверху редактора два линка: Import Changes и Enable Auto-Import. Сейчас самое время нажать Import Changes. IDEA сгенерирует настройки проекта. После этого вы увидите, что папки main/flex и main/resources в нашем модуле подсветились синим, как папки для сорцов, а папка test/flex подсветилась зеленым, как папка для тестов.

Можно глянуть, как IDEA настроила модуль: Ctrl+Alt+Shift+S. Полазте и увидите, что там есть модуль SuperLib, для него прописаны пути и зависимости, и вручную там ничего не нужно настраивать.

Самое время писать код.

Alt+1 (Project), SuperLib/src/main/flex, Alt+Insert, New Package, com.mycompany.CommonLibs.SuperLib, OK.

Alt+Insert, New ActionScript Class, SuperPuperUtil, OK.

Пишем код:


package com.mycompany.CommonLibs.SuperLib
{
public class SuperPuperUtil
{
	static public function sum(a : Number, b : Number) : Number
	{
		return a + b;
	}
}
}

Компилируем Ctrl+F9. Все ок, первый модуль готов. Можно заглянуть в SuperLib/target и убедиться, что скомпилированый swc лежит там. Ну и еще кой чего там лежит. Но вы ведь читали Maven: The Definitive Guide и все знаете о том, что там есть :)

Точно также создаем второй модуль MegaLib.

  • Alt+1, CommonLibs, Alt+Insert, New Module, Create module from scratch, Next
  • Name: MegaLib, type: Maven Module, Next
  • ArtifactId: MegaLib, create from archetype flexmojos-archetype-application, Finish
  • Редактируем pom.xml, все так же, как в предыдущем модуле, только artefactId другой. Жмем Import Changes.
  • Чистим MegaLib/src/test/flex, удаляем Main.xml. Создаем пакет com.mycompany.CommonLibs.MegaLib.

Создаем класс MegaExtraUtil, пишем код:


package com.mycompany.CommonLibs.MegaLib
{
public class MegaExtraUtil
{
	static public function mult(a : Number, b : Number) : Number
	{
		return a * b;
	}
}
}

Глянем теперь в корневой pom. Видим, что там появился блок


<modules>
	<module>SuperLib</module>
	<module>MegaLib</module>
</modules>

Запускаем mvn install для проекта. BUILD SUCCESSFUL

Comments

бьюсь над этой главой уже третий день.

Сейчас уперся в то, что idea после нажатия Ctrl + F9 выдает Flex sdk is not set fof faset for "Flex" in module SuperLib. После того как я привязываю модуль к sdk, то выдает SuperLib.config-report.1-0.xml not found в папке target и действительно никаких конфигов в target пакете проекта нет - хотя очевидно, что конфиги должны были быть созданы. Также в Maven Projects окошке зависимости от flex framework и флекс sdk светятся красным.

yzh44yzh's picture

Давненько это было написано :)

<configuration>
<configurationReport>true</configurationReport>
</configuration>
Это надо убрать, и вместо этого сделать такую запускалку:
mvn compile -DconfigurationReport=true

При этом в target будут сгенерены флекс-конфиги, по которым IDEA настроит проект.

Но лучше возьми готовый компилирующийся проект из более поздних статей.
http://yzh44yzh.com/flexmojos-standard-air отсюда
http://yzh44yzh.com/flexmojos-swz или отсюда

Там в комплекте zip-архивы с проектом, распаковываешь, а в них все настроено, мавен запускается, проект собирается.

И уже отталкиваясь от этих проектов делай свое.

Или вот отсюда можешь взять проектик https://github.com/yzh44yzh/flex-logging-console

Ура вы отозвались !! )))

Можно вам через скайп писать ?! А то я совсем в отчаяние впадаю, потому что часть девелоперов вообще не понимают и не хотят понимать о чем речь идет, а остальные так оторвались, что их уже не догнать.

Сейчас хочу понять как сцепляется flexmojos с sdk. Насколько я понимаю мы должны сцепить их в главном pom CommonLibs. Там у нас есть dependences плагина и dependences проекта. Не понимаю в чем разница? Не понимаю также откуда мавен подбирает pom-ы flex framework.

Запутался окончательно в версиях. Туториал по видимому для flexmojos 3.2, а я дурак с 3.5 работать.
А сейчас уже есть maven 3 и flexmojos 4. Что совсем загоняет в тоску.

У меня flex sdk версии 4.1.0 билд 16076
Плеер сейчас 10.1.103.19 но обновляется чуть ли ни каждые две недели. Получается что каждый раз это нужно будет в pom перезаписывать?

мой e-mail: futuresimple@yandex.ru
скайп presentsimple.ru

С Уважением, Сергей Иноземцев.

yzh44yzh's picture

Смотри здесь https://github.com/yzh44yzh/flex-logging-console/blob/master/pom.xml

"часть девелоперов вообще не понимают и не хотят понимать о чем речь идет" -- имеют полное право. Я тож дофига разных вещей не понимаю и не хочу понимать. .NET например :)

"а остальные так оторвались, что их уже не догнать" -- программирование не гонка, и не соревнование. Программист не догоняет кого-то, прораммист делает новое и фиксит проблемы в старом. Вот и все.

Ура. Удалось скомпилировать библиотеки SuperLib, MegaLib )

Чтобы создать модули, использовал archetype : flexmojos-archetypes-library 4.0-beta-2 соответственно.

При компиляции возникла ошибка:
Could not find artifact com.adobe.flexunit:uiRunner:swc:4.0-rc-1.1 in sonatype-repository

По этому пришлось закомментировать эту зависимость, поскольку в репозитории flexmojos нет пакета uiRunner, также пришлось поправить зависимость flexuint с версии 4.0-rc-1.1 на 4.0-rc-1.

Кроме того красным подсвечивается ...

Но в целом это прогресс, рассыпаюсь в благодарностях.

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.