Un projet Java / Flex avec Maven 2

Après un premier tuto sur la création d’un projet Flex avec Maven 2, nous pouvons maintenant nous pencher sur un chantier plus important encore : comment compiler mon Flex puis ma webapp Java en une fois avec Maven 2 ?

Comment personnaliser un peu la compilation Flex pour l’adapter à mes besoins ?

C’est par là…

Introduction

Si vous êtes ici, c’est donc que vous disposez :

  • d’un fichier start.cmd qui vous permet de lancer une ligne de commande permettant l’usage de Maven avec Flex
  • d’un projet Flex de test, constructible via Maven 2 et donc de son fichier pom.xml

Ce que nous allons faire

L’objectif est simple, une application Flex ne venant jamais seule, il devient rapidement intéressant de non seulement construire son SWF, mais également de préparer son WAR. Dans ces cas là, il devient intéressant de pouvoir effectuer ces tâches en une seule fois.

En pratique

Maven offre une possibilité très intéressante : le POM parent. Il s’agit en fait d’un “Meta POM” décrivant un ensemble de modules d’un projet plus global. Vous l’avez compris, votre projet global est une application Java / Flex, vos modules sont :

  • L’application Flex d’un côté
  • La webapp Java de l’autre

De ce fait, nous allons avoir trois fichiers pom.xml :

  1. Le POM parent décrivant le projet global (le fameux Meta POM)
  2. Le POM du projet Flex
  3. Le POM du projet Java

A nos outils

Construction de l’arborescence du projet

Maven propose (encore ?!) un outil très intéressant : les archetype. L’idée est de permettre la construction d’une arborescence type de projet en une ligne de commande.

Si je reprends l’arborescence du toto précédent, vous devez vous positionner dans le répertoire parent de demo-flex, soit, dans l’exemple suivant, au niveau de lafabrick :

Vous pouvez alors exécuter la fameuse ligne de commande : mvn archetype:create -DgroupId=com.lafabrick -Dpackagename=com.lafabrick -DartifactId=demo-java -DarchetypeArtifactId=maven-archetype-webapp

A la suite de cela, vous pouvez constater que l’arborescence suivante a été créée :

Vous constaterez également qu’un fichier pom.xml a été automatiquement créé dans le répertoire demo-java. Ce fichier est un fichier standard décrivant une webapp Java. Il ne reste à présent plus qu’à créer notre Meta POM et a indiquer à nos deux modules qu’ils sont des modules de ce dernier.

Voici le fichier pom.xml à créer au niveau du répertoire lafabrick (cf. arborescence ci-dessus).

<?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.lafabrick</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<name>Projet Java Flex avec lafabrick</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<modules>
<module>demo-flex</module>
<module>demo-java</module>
</modules>
</project>

Ce Meta POM (oui, j’aime bien cette expression bizarre) est finalement plutôt synthétique : il indique bien nos deux modules demo-java et demo-flex comme faisant partie d’un projet global nommé Projet Java Flex avec lafabrick.

Il reste à présent encore une dernière chose à faire : lier nos module au Meta POM (yes !).

Pour cela, ouvrez les fichiers pom.xml de chacun des projets et ajoutez-y les informations suivantes en tête de fichier (juste après le noeud racine <project>)

<parent>
<groupId>com.lafabrick</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
</parent>

Testons l’ensemble :

  • rendez-vous dans le répertoire lafabrick
  • ouvrez votre ligne de commande et tapez mvn clean package

Le résultat : nous avons à présent un fichier demo-flex-1.0.swf dans demo-flex/target et (entre autres) un fichier demo-java.war dans le répertoire demo-java/target.

Mouais, pas mal, mais comment faire en sorte que le résultat de ma compil SWF aille dans ma webapp ? C’est simple, il suffit de modifier la propriété directory de votre projet flex.

Pour cela, modifiez le fichier pom.xml du projet Flex en ajoutant, dans la balise <build>, la ligne suivante :

<directory>${basedir}/../demo-java/src/main/webapp/flex</directory>

Enregistrez et relancez la commande de construction du projet (comme tout à l’heure).

Voilà qui est mieux ! Le résultat est placé dans le répertoire demo-java/src/main/webapp/flex qui est ensuite inclus dans le WAR.

Attention cependant : en manipulant le répertoire de sortie du SWF, maven va, à chaque clean, supprimer la totalité du répertoire concerné, aussi, n’indiquez pas demo-java/src/main/webapp, vous vou retrouveriez à supprimer l’ensemble des sources de la webapp !;

Aller plus loin

BlazeDS ?

Vous pourriez en vouloir un peu plus, notamment concernant les options de compilation de l’application Flex : il est probable que vous ayez à indiquer par exemple le fichier <em>services-config.xml</em> à utiliser dans le cadre de l’utilisation des BlazeDS. Il faut savoir que le plugin ServeBox permet de modifier toutes (ou presque) les options de compilations disponibles avec mxmlc.

Aussi, je peux modifier mon fichier pom.xml le fichier services-config.xml à utiliser :

&lt;build&gt;
<directory>${basedir}/../demo-java/src/main/webapp/flex</directory>
&lt;plugins&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.servebox.flex2&lt;/groupId&gt;
&lt;artifactId&gt;flex2-plugin&lt;/artifactId&gt;
&lt;version&gt;0.9.1&lt;/version&gt;
&lt;extensions&gt;true&lt;/extensions&gt;
&lt;configuration&gt;
&lt;sourceDirectory&gt;/src/main/flex&lt;/sourceDirectory&gt;
&lt;mxmlFile&gt;src/main/flex/Main.mxml&lt;/mxmlFile&gt;
&lt;services&gt;${basedir}/../demo-java/src/main/webapp/WEB-INF/flex/services-config.xml&lt;/services&gt;
&lt;contextroot&gt;demo-java&lt;/contextroot&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;

Et voilà qui est fait.

Les différentes options disponibles pour l’instant…

Après un tour dans les sources du plugin, on retrouve la liste suivante des possibilités de paramétrage :

  • home (chemin vers le répertoire du SDK)
    Par défaut, prendra la valeur de la variable d’environnement FLEX_HOME
  • config (chemin vers le fichier flex-config.xml du SDK)
    Par défaut : ${flex2.sdk.home}/frameworks/flex-config.xml
  • out (répertoire cible de la génération du SWF / SWC)
    Par défaut : le répertoire <directory> indiqué dans la section <build> du POM
  • source (répertoire de sources Flex)
    Par défaut : src/main/flex
  • optimize (optimisation du bytecode)
    Par défaut : true
  • strict (mode strict)
    Par défaut : true
  • Xmx (taille de la mémoire en Mo allouée au compilateur)
    Par défaut : 128
  • contextroot (nom du contexte de la webapp)
    Par défaut : - vide -
  • services (fichier services-config.xml à utiliser)
    Par défaut : - vide -
  • useNetwork (utilisation du réseau ou non)
    Par défaut : true
  • chartinglicence (votre licence des composants graphiques)
    Par défaut : - vide -
  • asencoding (encodage de caractères des sources AS)
    Par défaut : utf-8
  • debug (mode debug)
    Par défaut : false
  • showbindingwarnings (warning sur les détections de changements de contrôle non pris en compte)
    Par défaut : true
  • showaswarnings (warning sur les classes ActionScript)
    Par défaut : true
  • showdeprecationwarnings (warning si utilisation de notations dépréciées)
    Par défaut : true
  • showtypeselectorwarnings (warning si utilisation <mx:Style>)
    Par défaut : true
  • accessible (mode accessible)
    Par défaut : false

Avec ça, si on peut pas faire du Flex avec Maven, c’est que vous utilisez les modules (RSL), et que ce n’est pas encore pris en compte…

A bientôt !


Tags: , , ,

2 Responses to “Un projet Java / Flex avec Maven 2”

» Suivre le fil de conversation
  1. younes /
    -->

    Super, ça répondait exactement à ma question ;)
    a+

  2. tectaunique /
    -->

    cool merci


Soit pas timide...

Powered by WP Hashcash