Un portail web lutece est une webapp java EE. Le contenu de cette webapp (JSP, classes java, templates HTML, etc.) provient directement du coeur de Lutece (obligatoire) et de plugins (facultatifs). L'assemblage d'une webapp à partir du coeur et de la liste de plugins est faite avec l'outil Maven (https://maven.apache.org/). Avant d'avancer dans la suite de ce chapitre, il est recommandé de connaitre le fonctionnement de Maven.
En plus d'une utilisation classique de Maven, l'assemblage de webapps Lutece s'appuie sur:
L'architecture du projet lutece est de construire une webapp contenant l'intégralité des fonctionnalités des plugins choisis. Pour ce faire, lutece-core contient les fichiers obligatoires d'une webapp (par exemple WEB-INF/web.xml) et les fichiers qui servent aux fonctionnalités communes à tous les plugins (code java, header et footer des pages html, etc.). Les plugins apportent en plus leurs propres fichiers. De plus, il est parfois nécessaire pour un site donné de pouvoir modifier certains fichiers présents dans lutece-core ou dans un lutece-plugin (par exemple, modifier un template html). L'objectif principal de l'assemblage d'une webapp lutece est donc de produire les bons fichiers venant des différentes sources à inclure dans la webapp finale. Nous allons voir comment lutece-maven-plugin atteint cet objectif.
Cependant, en dehors de l'assemblage de webapps, l'utilisation de maven permet aussi d'atteindre d'autres objectifs: gérér la compilation et les tests du code, pouvoir publier des artifacts fournissant une fonctionnalité réutilisable, générer la documentation technique (javadoc et Maven Site), etc.
lutece-maven-plugin effectue les actions suivantes:
Ces actions sont utilisées dans plusieurs contextes: Lutece-maven-plugin définit en effet plusieurs types d'artifacts maven qui correspondent aux différents éléments de l'architecture lutece: lutece-core, lutece-plugin, lutece-site. Lutece-core et lutece-plugin sont des artifacts qui contiennent des classes java à compiler et des fichiers à copier dans la webapp, lutece-site contient uniquement des fichiers à copier dans la webapp, surchargeant ceux provenant d'artifacts lutece-core ou lutece-plugin. Lutece-maven-plugin fournit des goals maven pour obtenir une webapp en version "exploded" pour les artifacts de type lutece-core et lutece-plugin, en version "war" pour les artifacts de type lutece-site. Nous verrons ces goals maven juste après.
La webapp complète contiendra aussi les fichiers provenant de deux dossiers spéciaux: defaultConfDirectory et localConfDirectory:
Enfin, le reactor maven (mode multi modules) est géré de manière très différente d'un projet maven multi module classique, comme nous le verrons après.
Nous utiliserons les goals suivants de lutece-maven-plugin :
Lutece-maven-plugin utilise de manière pervasive un concept similaire aux overlays de maven-war-plugin. Il est important de savoir dans quel ordre les overlays sont appliqués pour savoir quel fichier est utilisé lorsqu'un fichier est présent dans plusieurs sources. Ceci concerne uniquement les fichiers de la webapp (par exemple dans le dossier "webapp/" d'un lutece-plugin) et un assemblage sans modules maven. L'ordre est :
La version utilisée sera celle présente dans l'élément de cette liste avec le plus haut numéro.
Note: Il n'y a pas d'ordre défini entre les fichiers de deux dépendances, il ne faut donc pas qu'un même fichier existe dans deux dépendances différentes.
Pour l'assemblage en multi-module, l'ordre dépend de l'ordre des artifacts dans le reactor.
L'utilisation la plus simple de lutece-maven-plugin consiste à construire un artifact de type lutece-site sans plugins ni surcharge. Le projet contient alors uniquement un fichier pom.xml à la racine. Ce POM contient:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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/maven-v4_0_0.xsd">
<parent>
<artifactId>lutece-site-pom</artifactId>
<groupId>fr.paris.lutece.tools</groupId>
<version>2.0.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>lutece-example</artifactId>
<packaging>lutece-site</packaging>
<name>Lutece example</name>
<version>1.0.0</version>
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>luteceSnapshot</id>
<name>luteceSnapshot</name>
<url>http://dev.lutece.paris.fr/snapshot_repository</url>
</repository>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>lutece</id>
<name>luteceRepository</name>
<url>http://dev.lutece.paris.fr/maven_repository</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>fr.paris.lutece</groupId>
<artifactId>lutece-core</artifactId>
<version>5.0.0</version>
<type>lutece-core</type>
</dependency>
</dependencies>
</project>
On assemble la webapp en utilisant le goal maven :
$ mvn lutece:site-assembly
Cela produit la webapp en version "war" et "exploded" dans le dossier target:
lutece-example-1.0.0 lutece-example-1.0.0.war
On peut aussi activer des profils maven lors de ce goal pour utiliser un defaultConfDirectory différent :
$ mvn lutece:site-assembly -P prod
En utilisant le pom.xml du projet qu'on veut assembler, par exemple pour https://github.com/lutece-platform/lutece-core, on peut produire en invoquant le goal maven :
$ mvn lutece:exploded
La webapp en version "exploded" est disponible dans le dossier target/lutece/
Pour simplement propager les changements faits sur un artifact dans une webapp assemblée à partir d'un autre artifact, on peut utiliser le dépôt maven local comme intermédiaire.
Dans le premier projet, utiliser le goal:
$ mvn install
Puis dans le deuxième projet, utiliser :
$ mvn clean lutece:exploded
Cette méthode présente l'avantage de la simplicité, mais elle conduit à installer dans son dépôt local maven des artifacts qui peuvent être différents de ceux publiés dans les dépôts lutece. Cela peut rendre le travail collaboratif difficile car on ne teste plus la même chose que les autres. Il faut donc l'utiliser avec parcimonie, ou alors parfaitement maitriser le contenu de son dépôt local (par exemple en supprimant les artifacts installés à la main).
Pour éviter d'avoir à utiliser maven install sur toutes les dépendances, de polluer son dépôt local avec des versions différentes d'artifacts, on peut utiliser les modules maven et le reactor. Attention, l'utilisation des modules maven est très particulière avec lutece-maven-plugin et ne s'utilise qu'avec le goal "lutece:exploded". Le mode multi-module assemble une webapp à partir des différents artifacts du reactor dans le dossier "target/lutece" au niveau du pom aggrégateur. On ne peut donc pas utiliser d'artifact lutece-site dans ce genre d'assemblage. Contrairement à une utilisation classique du reactor où les derniers modules produisent les artifacts désirés, lutece-maven-plugin assemble directement tous les modules dans le dossier target du pom aggrégateur au cours du traitement du reactor.
On peut utiliser la structure de projets suivante où on a les différents projets venant de github et le global-pom :
lutece-core lutece-search-library-lucene lutece-system-plugin-systeminfo pom.xml
Par convention, on définit des modules lorsque le profile "multi-project" est activé en rajoutant ceci au global-pom pom.xml :
<profiles>
<profile>
<id>multi-project</id>
<modules>
<module>lutece-core</module>
<module>lutece-system-plugin-systeminfo/</module>
<module>lutece-search-library-lucene</module>
</modules>
</profile>
</profiles>
On peut ensuite assembler la webapp avec le goal:
$ mvn lutece:exploded -P multi-project
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Lutece global pom ................................. SUCCESS [1.238s]
[INFO] Lutece Analyzers and indexers ..................... SUCCESS [2.000s]
[INFO] Lutece ............................................ SUCCESS [4.659s]
[INFO] Lutece systeminfo plugin .......................... SUCCESS [0.325s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
La webapp est disponible dans le dossier "target/lutece"
Note: attention, à cause des particularités de lutece-maven-plugin en multi-modules, pour nettoyer et recompiler tout en une seule commande on doit utiliser :
$ mvn lutece:clean lutece:exploded -P multi-project
Enfin, pour ne recompiler qu'un seul projet d'un build multi module, on peut utiliser l'option testWebappDirectory en se plaçant au niveau du pom du projet en question:
$ mvn lutece:exploded -DtestWebappDirectory="<path_to_top_multiproject>/target/lutece"
Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.
Vous devriez rafraîchir la page.