Tuxitecte

Maven + Alfresco : Relations entre AMPs



Hello World !

Cette fois ci je vais essayer de vous expliquer les relations multi-modules AMP et comment on peut les gérer avec Maven et dans Alfresco aussi...

Introduction

La problématique est la suivante :
Dans un projet multi-AMP, comment modéliser les relations et comment organiser notres (ou nos) projets Maven ?

Admettons que nous voulons créer un projet comprenant 3 AMPS : A, B, C

Avant toute chose, quelles sont les relations qui existent entre ces 3 AMPS ? Sont ils dépendants les uns par rapport aux autres ? Quels sont les relations induites ?

Ensuite, quel est le format de livraison de notre application ? S'agit il d'un WAR, d'un AMP unique, d'un ensemble d'AMP, d'un format particulier de livraison....

Suivant les réponses de chacune des questions, il faudra mettre en place une politique différente! et bien entendu une configuration des projets Maven différents !

On peut retrouver plusieurs cas d'utilisation.
  • Les relations simples : Autrement dit il s'agit des mêmes dépendances que l'on a déjà vu depuis que l'on a commencé nos projets. Dans notre cas, les modules A, B et C sont indépendants mais notre serveur de production a besoin de ces 3 modules pour répondre aux besoins des utilisateurs. Par exemple, il peut s'agir d'intégrer le module de RM d'Alfresco, le module SharePoint d'Alfresco et notre propre module comprenant nos personnalisation.
  • Les dépendances (faibles et fortes) : Dans ce cas de figure, l'un des modules a besoin d'un autre module pour fonctionner. Un exemple simple est la liaison qui peut exister entre un modèle de données et des actions associés à ce modèle de données. Si le modèle n'existe pas et n'est pas installé alors B ne peut fonctionner. Si B est modifié alors il modifie le comportement de A.
Comment modéliser (et tester!) ces relations dans notre projet ?

Les relations simples

Reprenons notre module alf-amp-osecm

Actuellement, notre module ne possède que des dépendances vers des librairies déjà présent dans le war Alfresco. Cela ne pose aucun problème puisque le démarrage de notre serveur jetty s'effectue avec le war d'Alfresco.

Or maintenant je souhaite tester mon module avec la présence d'un autre module. Pour exemple, je vais prendre le module SDK-TaggingSample (créé et transformé précédemment en module - cf. post ici). L'idée est d'ajouter ce module dans Alfresco.war, de packager mon module puis de lancer jetty pour qu'il prenne en compte mon module.

Pour ajouter mon module on va ajouter dans le pom.xml de mon projet alf-amp-osecm, le quadruplet ci-dessous entre les balises //dependencies> dans la profil webapp



org.alfresco.sample
SDK-TaggingSample
amp
1.0



A ce stade, on pourrait se dire, c'est bon on lance la commande maven :

mvn clean integration-test -P webapp,clean-jetty -DskipTests=true

et on a un Alfresco démarré avec nos 2 modules. Et bien non... Cela serait trop simple !

En effet, le format AMP est un format un peu particulier qui n'est reconnu par Maven que grâce au plugin : maven-amp-plugin. Or ici on a ajouté une dépendance avec un AMP ! La question qui se pose c'est comment maven sait il quoi en faire et sait il l'intégrer dans le war "explosé" nécessaire à jetty ? La réponse est bien entendu NON !

La solution réside dans la déclaration d'un nouveau plugin : maven-dependency-plugin. Ce plugin comme son nom l'indique nous permet de manipuler les dépendances et donc les artefacts et donc les AMP ! On va ainsi configurer ce plugin afin qu'il prenne en compte notre dépendance et l'installer dans le war.

Comment ? et bien via la configuration ci-dessous que l'on intégrera dans le profil webapp (dans mon cas, il se trouve maintenant dans le projet alf-sdk. Factorisation oblige ! Par contre la déclaration de dépendance se situe dans mon pom.xml)



org.apache.maven.plugins
maven-dependency-plugin


unpack-amps
process-resources

unpack-dependencies


amp
${build.directory}/${webapp.name}
META*





org.alfresco.maven.plugin
maven-amp-plugin
3.0.2





On note que ce plugin va prendre toutes les dépendances de type AMP et va exécuter le goal : unpack-dependencies dans le répertoire ${build.directory}/${webapp.name}. En d'autre terme il va installer l'AMP comme le ferait (presque) l'outil de management des modules.

Ensuite, on doit ajouter un bloc testRessource toujours dans le profil Webapp.


true
.

module.properties

alfresco/module/${project.groupId}.${project.artifactId}



Ce bloc est nécessaire dès que l'on veut intégrer plusieurs AMP dans un war (ce qui est notre cas ici).

Maintenant on peut lancer la commande :

mvn clean integration-test -P webapp,clean-jetty -DskipTests=true

et vérifier (après quelques minutes) de la prise en compte de nos 2 AMPS !

C'est beau la technologie !

Les dépendances

Maintenant intéressons nous aux dépendances. Dans ce cas de figure je ne souhaite pas que mon application démarre si mon module n'a pas toutes les dépendances nécessaires. On aurait alors une application instable qui pourrait endommager des données !! (ce que je ne souhaite évidemment pas...).

Comment définir ces dépendances fortes entre mes modules ?

Reprenons l'exemple précédent. Suite à des modifications importantes de mon code, je souhaite créer une liaison forte entre mon projet et le projet SDK-TaggingSample. Pour cela il y a un mécanisme défini dans l'AMP et disponible via le fichier module.properties (situé à la racine de notre projet).
En fin de ce fichier, il suffit de rajouter la ligne ci-dessous pour créer une dépendance :

module.depends.org.alfresco.sample.SDK-TaggingSample=0.1-*

A noter le formalisme simple :
  • module.depends : pour définir une dépendance du module
  • . ou nom du module : pour identifier le module
  • X.X - Y.Y : Pour déterminer la porté du module à prendre en compte (entre X.X et Y.Y). Notre module dépend du SDK-TaggingSample à partir de la version 0.1. (A noter la possibilité de mettre le caractère * pour signifier n'importe lequel)
Pour de plus amples informations : wiki.alfresco.com

Vous pouvez maintenant démarrer l'application via la commande Maven :

mvn clean integration-test -P webapp -DskipTests=true

Comme vous pouvez le voir, rien à changer! C'est déjà ça. Mais ce que l'on aimerait là, c'est de vérifier que notre mécanisme anti-démarrage fonctionne bien. Pour cela vous avez deux choix.
Soit
  • Vous modifiez le numéro de version dans le fichier module.properties pour avoir par exemple : module.depends.org.alfresco.sample.SDK-TaggingSample=99.99-*
  • Vous supprimer la dépendance dans la partie dependencies du pom.xml.
Dans ces deux cas, relancer l'application et vous vous apercevrez dans la console d'une jolie stackTrace vous interdisant de démarrer l'application si la dépendance n'est pas respectée !


Et les projets Maven multi-modules ?

Maven permet de créer des projets multi-modules. Si vous ne connaissez pas l'idée qui se cache derrière, je ne serai vous conseillez de lire ceci. Sinon pour simplifier les choses, admettons que votre projet se décompose de 2 AMPS. Ces 2 AMPS possèdent une dépendance forte l'un envers l'autre. Ce que vous cherchez c'est un seul pom.xml vous permettant de construire (faire un build) des 2 projets en même temps. En d'autre termes, je lance une commande mvn clean install, cette commande va être exécuté sur les 2 projets ! On va encore plus loin dans l'héritage et dans les principes Maven ! Pour la pratique on verra cela un peu plus tard ^^

Voilà c'est fini pour aujourd'hui !

Mavenisez bien !

PS :

Les sources du projet alf-sdk sont disponibles ici : http://www.box.net/shared/exremqsr0m


Les sources du projet alf-amp-osecm sont disponibles ici : http://www.box.net/shared/dzige0nchr


Digg Google Bookmarks reddit Mixx StumbleUpon Technorati Yahoo! Buzz DesignFloat Delicious BlinkList Furl

0 commentaires: on "Maven + Alfresco : Relations entre AMPs"

Enregistrer un commentaire