Package de structure du référentiel de projet AEM

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.

Package de structure du référentiel

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.

Création du package de structure de référentiel

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>

Référence au package de structure de référentiel

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>

Cas d’utilisation du package à code multiple

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 :

  • Le package de code A se déploie dans /apps/a
  • Le package de code B se déploie dans /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 :

  • Le package de code A doit définir une valeur <repositoryStructurePackage> sur le package de structure de référentiel du projet (qui doit avoir un filtre /apps).
  • Le package de code B doit définir une valeur <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.

Erreurs et débogage

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.

Ressources supplémentaires

Sur cette page