Pacote de estrutura do repositório de projetos do AEM

Os projetos Maven para Adobe Experience Manager as a Cloud Service exigem uma definição de pacote de subestrutura de repositório cujo único objetivo é definir as raízes do repositório JCR em que os pacotes de subpacotes de código do projeto são implantados. Isso garante que a instalação de pacotes no Experience Manager as a Cloud Service seja automaticamente ordenada por dependências de recursos JCR. A falta de dependências pode levar a cenários em que subestruturas seriam instaladas antes de suas estruturas principais e, portanto, seriam removidas inesperadamente, interrompendo a implantação.

Se o pacote de código for implantado em um local não coberto pelo pacote de código, quaisquer recursos ancestrais (recursos JCR mais próximos à raiz JCR) deverão ser enumerados no pacote de estrutura do repositório para estabelecer essas dependências.

Pacote de estrutura do repositório

O pacote de estrutura do repositório define o estado comum esperado de /apps que o validador de pacote usa para determinar áreas "seguras contra possíveis conflitos", pois são raízes padrão.

Os caminhos mais típicos a serem incluídos no pacote de estrutura do repositório são:

  • /apps que é um nó fornecido pelo sistema
  • /apps/cq/..., /apps/dam/..., /apps/wcm/..., e /apps/sling/... que fornecem sobreposições comuns para /libs.
  • /apps/settings que é o caminho raiz da configuração com reconhecimento de contexto compartilhado

Observe que este subpacote não tem qualquer conteúdo e é composto apenas por um pom.xml definição das raízes do filtro.

Criação do pacote de estrutura do repositório

Para criar um pacote de estrutura do repositório para seu projeto Maven, crie um novo subprojeto Maven vazio, com o seguinte pom.xml, atualizando os metadados do projeto para que estejam em conformidade com seu projeto Maven principal.

Atualize o <filters> para incluir todas as raízes de caminho do repositório JCR nos quais os pacotes de código são implantados.

Certifique-se de adicionar esse novo subprojeto Maven aos projetos principais <modules> lista.

<?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 will be deployed and remove all defined filter roots -->
                    <cloudManagerTarget>none</cloudManagerTarget>
                </properties>
                <configuration>
                    <properties>
                        <!-- Set Cloud Manager Target to none, else this package will be 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 overlayed 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>

Referência ao pacote de estrutura do repositório

Para usar o pacote de estrutura do repositório, faça referência a ele por meio de todo o pacote de código (os subpacotes que são implantados no /apps) Projetos Maven por meio dos plug-ins Maven do pacote de conteúdo FileVault <repositoryStructurePackage> configuração.

No ui.apps/pom.xmle qualquer outro pacote de código pom.xmls, adicione uma referência à configuração do pacote de estrutura do repositório do projeto (#repository-structure-package) ao plug-in FileVault package Maven.

...
<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>

Caso de uso do pacote de vários códigos

Um caso de uso menos comum e mais complexo é o suporte à implantação de vários pacotes de código que são instalados nas mesmas áreas do repositório JCR.

Por exemplo:

  • O pacote de códigos A é implantado em /apps/a
  • O pacote de código B é implantado em /apps/a/b

Se uma dependência no nível do pacote não for estabelecida no pacote de código B no pacote de código A, o pacote de código B poderá ser implantado primeiro em /apps/a, seguido pelo pacote de código B, que é implantado em /apps/a, resultando na remoção dos componentes previamente instalados /apps/a/b.

Neste caso:

  • O pacote de códigos A deve definir um <repositoryStructurePackage> no pacote de estrutura do repositório do projeto (que deve ter um filtro para /apps).
  • O pacote de códigos B deve definir um <repositoryStructurePackage> no pacote de código A, porque o pacote de código B é implantado no espaço compartilhado pelo pacote de código A.

Erros e depuração

Se os pacotes de estrutura do repositório não forem configurados corretamente, na compilação Maven, um erro será relatado:

1 error(s) detected during dependency analysis.
Filter root's ancestor '/apps/some/path' is not covered by any of the specified dependencies.

Isso indica que o pacote de códigos de quebra não tem um <repositoryStructurePackage> que lista /apps/some/path em sua lista de filtros.

Recursos adicionais

Nesta página