Les projets Maven pour Adobe Experience Manager as a Cloud Service nécessitent une définition de sous-package de structure de référentiel dont le seul objectif est de définir les racines du référentiel JCR dans lesquelles les sous-packages de code du projet sont déployés. Cette méthode garantit que l’installation des packages dans Experience Manager as a Cloud Service est automatiquement ordonnée par les dépendances des ressources JCR. Les dépendances manquantes peuvent conduire à des scénarios où des sous-structures seraient installées avant leurs structures parents et seraient donc supprimées de manière inattendue, ce qui interromprait le déploiement.
Si votre package de code se déploie dans un emplacement non couvert par le package de code, toutes les ressources ancêtres (ressources JCR plus proches de la racine JCR) doivent être énumérées dans le package de structure de référentiel. Ce processus est nécessaire pour établir ces dépendances.
Le package de structure de référentiel définit l’état commun attendu /apps
que le validateur de package utilise pour déterminer les zones « à l’abri des conflits potentiels », car il s’agit de racines standard.
Les chemins les plus courants à inclure dans le package de structure de référentiel sont les suivants :
/apps
, qui est un nœud fourni par le système/apps/cq/...
, /apps/dam/...
, /apps/wcm/...
et /apps/sling/...
, qui fournissent les recouvrements communs pour /libs
./apps/settings
, qui est le chemin racine de configuration reconnaissant le contexte partagéCe sous-package n’a pas tout contenu et est constitué uniquement d’un pom.xml
définition des racines du filtre.
Pour créer un module de structure de référentiel pour votre projet Maven, créez un sous-projet Maven vide, avec le code suivant : pom.xml
, mise à jour des métadonnées du projet pour qu’elles soient conformes à votre projet Maven parent.
Mettez à jour le <filters>
pour inclure toutes les racines du chemin d’accès au référentiel JCR dans lesquelles vos packages de code sont déployés.
Veillez à ajouter ce nouveau sous-projet Maven aux projets parents. <modules>
liste.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- ====================================================================== -->
<!-- P A R E N T P R O J E C T D E S C R I P T I O N -->
<!-- ====================================================================== -->
<parent>
<groupId>com.my-company</groupId>
<artifactId>my-app</artifactId>
<version>x.x.x</version>
<relativePath>../pom.xml</relativePath>
</parent>
<!-- ====================================================================== -->
<!-- P R O J E C T D E S C R I P T I O N -->
<!-- ====================================================================== -->
<artifactId>ui.apps.structure</artifactId>
<packaging>content-package</packaging>
<name>UI Apps Structure - Repository Structure Package for /apps</name>
<description>
Empty package that defines the structure of the Adobe Experience Manager repository the code packages in this project deploy into.
Any roots in the code packages of this project should have their parent enumerated in the filters list below.
</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<properties>
<!-- Set Cloud Manager Target to none, else this package is deployed and remove all defined filter roots -->
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
<configuration>
<properties>
<!-- Set Cloud Manager Target to none, else this package is deployed and remove all defined filter roots -->
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
<filters>
<!-- /apps root -->
<filter><root>/apps</root></filter>
<!--
Examples of complex roots
Overlays of /libs typically require defining the overlay structure, at each level here.
For example, adding a new section to the main AEM Tools navigation, necessitates the following rules:
<filter><root>/apps/cq</root></filter>
<filter><root>/apps/cq/core</root></filter>
<filter><root>/apps/cq/core/content</root></filter>
<filter><root>/apps/cq/core/content/nav/</root></filter>
<filter><root>/apps/cq/core/content/nav/tools</root></filter>
Any /apps level Context-aware configurations need to enumerated here.
For example, providing email templates under `/apps/settings/notification-templates/com.day.cq.replication` necessitates the following rules:
<filter><root>/apps/settings</root></filter>
<filter><root>/apps/settings/notification-templates</root></filter>
<filter><root>/apps/settings/notification-templates/com.day.cq.replication</root></filter>
-->
</filters>
</configuration>
</plugin>
</plugins>
</build>
</project>
Pour utiliser le package de structure de référentiel, référencez-le via tous les packages de code (les sous-packages qui se déploient vers /apps
) Projets Maven via les modules de contenu FileVault Maven <repositoryStructurePackage>
configuration.
Dans le package de code ui.apps/pom.xml
et tout autre package de code pom.xml
, ajoutez une référence à la configuration du package de structure de référentiel du projet (#repository-structure-package) dans le module externe Maven du package FileVault.
...
<build>
<plugins>
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
...
<repositoryStructurePackages>
<repositoryStructurePackage>
<groupId>${project.groupId}</groupId>
<artifactId>ui.apps.structure</artifactId>
<version>${project.version}</version>
</repositoryStructurePackage>
</repositoryStructurePackages>
</configuration>
</plugin>
...
</build>
<dependencies>
<!-- Add the dependency for the repository structure package so it resolves -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>ui.apps.structure</artifactId>
<version>${project.version}</version>
<type>zip</type>
</dependency>
...
</dependencies>
Un cas d’utilisation moins courant et plus complexe prend en charge le déploiement de plusieurs packages de code installés dans les mêmes zones du référentiel JCR.
Par exemple :
/apps/a
/apps/a/b
Si une dépendance au niveau du package n’est pas établie à partir du package de code B sur le package de code A, le package de code B peut être déployé en premier dans /apps/a
. Il serait ensuite suivi du module de code B, qui se déploie dans /apps/a
. Le résultat est la suppression du fichier précédemment installé. /apps/a/b
.
Dans ce cas :
<repositoryStructurePackage>
sur le package de structure de référentiel du projet (qui doit avoir un filtre /apps
).<repositoryStructurePackage>
sur le package de code A, car le package de code B se déploie dans l’espace partagé par le package de code A.Si les packages de structure de référentiel ne sont pas configurés correctement, une erreur est signalée lors de la création de Maven :
1 error(s) detected during dependency analysis.
Filter root's ancestor '/apps/some/path' is not covered by any of the specified dependencies.
Cette erreur indique que le package de code de saut n’a pas de <repositoryStructurePackage>
qui répertorie /apps/some/path
dans sa liste de filtres.