Flexmojos. Super Pom, условная компиляция, индивидуальные настройки.

Hello тем, кому еще не надоела эта тема. Продолжаем.

Flex Super Pom

Ну вот мы уже создали парочку проектов, а то и больше. И теперь посмотрим на корневые pom этих проектов. Они совпадают на 90%. Собственно, отличаются только координаты артефактов и список дочерних модулей.

Всякий нормальный программист хочет избежать дублирования информации. Во flexmojos для этого используется flex super pom. Это родительский pom для любых флекс проектов. И сделать его очень просто: вынести все то общее, что есть в корневых pom ваших проектов в отдельный файл. Указать в этом файле координаты артефакта, инсталлировать его. И указать этот артефакт как родительский для корневых pom проектов.

К примеру, у меня получился такой flex super pom:



<?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">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.flashdevs.flexSuperPom</groupId>
	<artifactId>FlexSuperPom</artifactId>

	<version>1.0-SNAPSHOT</version>
	<packaging>pom</packaging>

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

		<fp.version>9.0.124</fp.version>
		<debug>true</debug>
	</properties>

	<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-de3</version>
					<extensions>true</extensions>

					<dependencies>
						<dependency>
							<groupId>com.adobe.flex</groupId>
							<artifactId>compiler</artifactId>

							<version>${fdk.version}</version>
							<type>pom</type>
						</dependency>
					</dependencies>

					<configuration>

						<debug>${debug}</debug>
						<targetPlayer>${fp.version}</targetPlayer>

						<warnings>

							   <noConstructor>false</noConstructor>
						</warnings>

					</configuration>
				</plugin>
			</plugins>

		</pluginManagement>
	</build>

	<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>

</project>

Ну а pom файлы проектов CommonLibs и AmazingProj упростились до:


<?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>
		<groupId>com.flashdevs.flexSuperPom</groupId>
		<artifactId>FlexSuperPom</artifactId>

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

	<groupId>com.mycompany.CommonLibs</groupId>

	<artifactId>CommonLibs</artifactId>
	<version>1.0</version>
	<packaging>pom</packaging>

	<modules>

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

</project>

и


<?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>
		<groupId>com.flashdevs.flexSuperPom</groupId>
		<artifactId>FlexSuperPom</artifactId>

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

	<groupId>com.mycompany.AmazingProj</groupId>

	<artifactId>AmazingProj</artifactId>
	<version>1.0</version>
	<packaging>pom</packaging>

	<modules>

		<module>TheBestOne</module>
	</modules>

</project>

Тут мы можете найти super pom, который использует Develar. А тут комментарии Develar по этому super pom.

К этому еще можно добавить, что вы можете строить какую угодно иерархию pom файлов за пределами проектов и модулей. Наверное, имеет смысл иметь один super pom для проектов на flex sdk 3.5, другой для проектов flex sdk 4.0, и еще один, родительский для этих двух.

Условная компиляция

Все мы прекрасно знаем, что mxmlc поддерживает условную компиляцию. То есть, если мы в аргументах компилятора укажем такие параметры:


<flex-config xmlns="http://www.adobe.com/2006/flex-config">
<compiler>
        <define>
                <name>COMPILER::PARAM1</name>

                <value>"value1"</value>
        </define>
        <define>
                <name>COMPILER::PARAM2</name>
                <value>"value2"</value>

        </define>
</compiler>
</flex-config>

То в AS коде появятся константы COMPILER::PARAM1 и COMPILER::PARAM1. Типичное применение этой возможности -- включение-выключение отладочного кода. Мы же это используем, чтобы делать сборки проекта, жестко привязанные к определенному окружению (ну есть у нас такая надобность).

При использовании IDEA без Maven нужно кое-где полазить в настройках проекта, чтобы забить там эти константы. Иначе парсер будет недоволен, встретив их в коде.

С Maven мы указываем эти настройки в pom файле.


<build>

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

        <extensions>true</extensions>

        <configuration>

                <definesDeclaration>
                        <property>
                                <name>COMPILER::BUILD_NUMBER</name>

                                <value>"${svn.build}"</value>
                        </property>
                        <property>
                                <name>COMPILER::PARAM1</name>
                                <value>"${somewhere.defined.param1}"</value>

                        </property>
                        <property>
                                <name>COMPILER::PARAM2</name>
                                <value>"value2"</value>
                        </property>

                </definesDeclaration>

        </configuration>

</plugin>
</plugins>
</pluginManagement>
</build>

И, разумеется, парсер остается вполне доволен.

Индивидуальные настройки для каждого разработчика

Довольно типичная проблема в работе команды это то, что у разных разработчиков некоторые настройки проекта должны быть разными. У нас, например, такая ситуация:

Нужно, чтобы скомпилированные swf файлы IDEA ложила не в project/module/target, а на веб сервере. Достигается это указанием параметра output


<build>
<plugins>
<plugin>

        <groupId>org.sonatype.flexmojos</groupId>
        <artifactId>flexmojos-maven-plugin</artifactId>
        <configuration>
                <sourceFile>MyApp.mxml</sourceFile>

                <configurationReport>true</configurationReport>
                <output>/var/www/html/myprop/myapp.swf</output>
        </configuration>
</plugin>
</plugins>

</build>

Но вот беда, путь к document root веб сервера у разных разработчиков разный. В моем православном линуксе это /var/www/html,

но у виндузятников с их богомерзким Денвером этот путь выглядит как-то так z:/www/i/cant/remember/this/very/deep/path/localhost/www/

Поэтому нужны индивидуальные настройки:

<output>${www.root}/myprop/myapp.swf</output>

Причем переменная ${www.root} должна быть определена где-то за пределами проекта. Наиболее подходящим местом мне кажется ~/.m2/settings.xml

В нашей команде у каждого разработчика в ~/.m2/settings.xml есть такой блок:


<profile>
        <id>dev</id>
        <properties>
                <www.root>/var/www/html/</www.root>

                <www.uri>http://localhost/</www.uri>
                <fms.root>/opt/fms/applications/</fms.root>
                <fms.uri>rtmp://localhost/</fms.uri>
        </properties>

</profile>

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

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.