Hello тем, кому еще не надоела эта тема. Продолжаем.
Ну вот мы уже создали парочку проектов, а то и больше. И теперь посмотрим на корневые 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