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 subpacote da estrutura de repositório cujo único objetivo é definir as raízes do repositório JCR nas quais os 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 solicitada pelas dependências de recursos do JCR. Dependências ausentes podem levar a cenários em que subestruturas seriam instaladas antes de suas estruturas pai e, portanto, seriam removidas inesperadamente, quebrando 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 pacotes usa para determinar áreas "seguras de 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 de configuração compartilhado com reconhecimento de contexto

Observe que este subpacote não tem qualquer conteúdo e seja composto apenas de 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 de repositório para seu projeto Maven, crie um novo subprojeto Maven vazio, com o seguinte pom.xml, atualizando os metadados do projeto para estar em conformidade com o projeto Maven pai.

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

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

<?xml version="1.0" encoding="UTF-8"?>
<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/POM/4.0.0 http://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>

Fazendo 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 todo o pacote de código (os pacotes secundários que são implantados no /apps) Projetos Maven por meio do pacote de conteúdo FileVault , plug-ins Maven <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 de 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:

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

Se uma dependência de nível de pacote não for estabelecida a partir do 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, o que resulta na remoção do /apps/a/b.

Nesse caso:

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

Erros e depuração

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

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ódigo de quebra não tem um <repositoryStructurePackage> que lista /apps/some/path na lista de filtros.

Recursos adicionais

Nesta página