Estrutura de projetos do AEM
Este artigo descreve as alterações necessárias para que os projetos do Adobe Experience Manager Maven sejam compatíveis com o AEM as a Cloud Service, garantindo que eles respeitem a divisão de conteúdo mutável e imutável. Além disso, as dependências são estabelecidas para criar implantações determinísticas e não conflitantes e são agrupadas em uma estrutura implantável.
As implantações de aplicativos do AEM devem ser compostas por um único pacote do AEM. Este pacote deve, por sua vez, conter subpacotes que incluem tudo o que o aplicativo exige para funcionar, incluindo código, configuração e qualquer conteúdo de linha de base de suporte.
O AEM requer uma separação de conteúdo e código, o que significa que um único pacote de conteúdo não pode ser implantado em ambas /apps e áreas graváveis em tempo de execução (por exemplo, /content, /conf, /home ou qualquer coisa que não seja /apps) do repositório. Em vez disso, o aplicativo deve separar código e conteúdo em pacotes separados para implantação no AEM.
A estrutura do pacote descrita neste documento é compatível com ambas as implantações de desenvolvimento locais e implantações do serviço da AEM Cloud.
Áreas mutáveis versus imutáveis do repositório mutable-vs-immutable
As áreas /apps e /libs do AEM são consideradas imutáveis porque não podem ser alteradas (criar, atualizar, excluir) após o AEM ser iniciado (isto é, no tempo de execução). Qualquer tentativa de alterar uma área imutável no tempo de execução falha.
Todo o restante no repositório, /content, /conf, /var, /etc, /oak:index, /system, /tmp e assim por diante, são áreas mutáveis, o que significa que podem ser alteradas em tempo de execução.
/libs não deve ser modificado. Somente o código de produto da AEM pode ser implantado em /libs.Índices Oak oak-indexes
Os índices Oak (/oak:index) são gerenciados pelo processo de implantação do AEM as a Cloud Service. O motivo é que o Cloud Manager deve aguardar até que qualquer novo índice seja implantado e totalmente reindexado antes de alternar para a nova imagem de código.
Por isso, embora os índices Oak sejam mutáveis no tempo de execução, eles devem ser implantados como código para que possam ser instalados antes que qualquer pacote mutável seja instalado. Portanto, as configurações de /oak:index fazem parte do Pacote de Código e não do Pacote de Conteúdo conforme descrito abaixo.
Estrutura de pacotes recomendada recommended-package-structure
Este diagrama fornece uma visão geral da estrutura de projeto recomendada e dos artefatos de implantação de pacote.
A estrutura de implantação de aplicativo recomendada é a seguinte:
Pacotes de código / pacotes OSGi
-
O arquivo Jar do pacote OSGi é gerado e incorporado diretamente em todo o projeto.
-
O pacote
ui.appscontém todo o código a ser implantado e só é implantado em/apps. Elementos comuns do pacoteui.appsincluem, mas não estão limitados a:- Definições de componentes e scripts HTL
/apps/my-app/components
- JavaScript e CSS (via Bibliotecas de Clientes)
/apps/my-app/clientlibs
- Sobreposições de
/libs/apps/cq,/apps/dam/e assim por diante.
- Configurações sensíveis ao contexto de fallback
/apps/settings
- ACLs (permissões)
- Qualquer
rep:policypara qualquer caminho em/apps
- Qualquer
- Scripts agrupados pré-compilados
- Definições de componentes e scripts HTL
Pacotes de conteúdo
-
O pacote
ui.contentcontém todo o conteúdo e configuração. O Pacote de Conteúdo contém todas as definições de nó que não estão nos pacotesui.appsouui.configou, em outras palavras, que não estão em/appsou/oak:index. Elementos comuns do pacoteui.contentincluem, mas não estão limitados a:- Configurações sensíveis ao contexto
/conf
- Estruturas de conteúdo complexas e necessárias (ou seja, criação de conteúdo que se baseia em e estende estruturas de conteúdo de linha de base anteriores definidas na inicialização de repositório).
/content,/content/dame assim por diante.
- Taxonomias de marcação controladas
/content/cq:tags
- Nós etc herdados (idealmente, migre esses nós para locais que não são/etc)
/etc
- Configurações sensíveis ao contexto
Pacotes de contêineres
-
O pacote
allé um pacote de contêiner que APENAS inclui artefatos implantáveis, o arquivo Jar do pacote OSGI,ui.apps,ui.configeui.contentpacotes como incorporados. O pacoteallnão deve ter nenhum conteúdo ou código próprio, mas deve delegar toda a implantação no repositório em seus subpacotes ou arquivos Jar de pacote OSGi.Agora os pacotes são incluídos usando a configuração incorporada do plug-in Maven FileVault Package Maven, em vez da
<subPackages>configuração.Para implantações complexas do Experience Manager, pode ser desejável criar vários projetos/pacotes do
ui.apps,ui.configeui.contentque representem sites ou locatários específicos no AEM. Se essa abordagem for feita, verifique se a divisão entre conteúdo mutável e imutável é respeitada, e se os pacotes de conteúdo necessários e os arquivos Jar do pacote OSGi estão incorporados como subpacotes no pacote de conteúdo do contêinerall.Por exemplo, uma estrutura complexa de pacote de conteúdo de implantação pode ter esta aparência:
-
O pacote de conteúdo
allincorpora os seguintes pacotes, para criar um artefato de implantação singularcommon.ui.appsimplanta o código exigido por ambos site A e site Bsite-a.coreJar do pacote OSGi exigido pelo site Asite-a.ui.appsimplanta o código exigido pelo site Asite-a.ui.configimplanta as configurações de OSGi exigidas pelo Site Asite-a.ui.contentimplanta o conteúdo e a configuração exigidos pelo site A- Jar do pacote OSGi
site-b.coreexigido pelo site B site-b.ui.appsimplanta o código exigido pelo site Bsite-b.ui.configimplanta as configurações de OSGi exigidas pelo site Bsite-b.ui.contentimplanta o conteúdo e a configuração exigidos pelo site B
-
-
O pacote
ui.configcontém todas as configurações OSGi:-
Código considerado e pertence a pacotes OSGi, mas não contém nós de conteúdo regulares. Assim, ele é marcado como um pacote de contêiner
-
Pasta organizacional contendo definições de configuração OSGi específicas do modo de execução
/apps/my-app/osgiconfig
-
Pasta de configuração OSGi comum contendo configurações OSGi padrão que se aplicam a todos os destinos de implantação do AEM as a Cloud Service
/apps/my-app/osgiconfig/config
-
Executar pastas de configuração OSGi específicas do modo que contenham configurações OSGi padrão aplicáveis a todos os destinos de implantação do AEM as a Cloud Service
/apps/my-app/osgiconfig/config.<author|publish>.<dev|stage|prod>
-
Scripts de configuração do OSGi de inicialização do repositório
-
Inicialização do repositório é a maneira recomendada de implantar conteúdo (mutável) que logicamente faz parte do aplicativo do AEM. As configurações do OSGi de inicialização do repositório devem ser colocadas na pasta
config.<runmode>apropriada, conforme descrito acima, e devem ser usadas para definir:- Estruturas de conteúdo de linha de base
- Usuários
- Usuários do serviço
- Grupos
- ACLs (permissões)
-
-
Pacotes de Aplicativos Adicionais extra-application-packages
Se outros Projetos do AEM - que são eles mesmos compostos de seus próprios pacotes de código e conteúdo - forem usados pela implantação do AEM, seus pacotes de contêiner deverão ser incorporados ao pacote all do projeto.
Por exemplo, um projeto do AEM que inclui aplicativos AEM de dois fornecedores pode ser semelhante a:
-
O pacote de conteúdo
allincorpora os seguintes pacotes, para criar um artefato de implantação singular- Jar do pacote OSGi
coreexigido pelo aplicativo AEM ui.appsimplanta o código exigido pelo aplicativo AEM- O
ui.configimplanta as configurações de OSGi exigidas pelo aplicativo do AEM ui.contentimplanta o conteúdo e a configuração exigidos pelo aplicativo AEMvendor-x.allimplanta tudo (código e conteúdo) exigido pelo aplicativo X do fornecedorvendor-y.allimplanta tudo (código e conteúdo) exigido pelo aplicativo Y do fornecedor
- Jar do pacote OSGi
Tipos de encapsulamento package-types
Os pacotes devem ser marcados com o tipo de pacote declarado. Os tipos de pacote ajudam a esclarecer a finalidade e a implantação de um pacote.
- Os pacotes de contêineres devem definir seu
packageTypecomocontainer. Os pacotes de contêineres não devem conter nós regulares. Somente pacotes OSGi, configurações e pacotes secundários são permitidos. Os contêineres no AEM as a Cloud Service não podem usar ganchos de instalação. - Os pacotes de código (imutáveis) devem definir seus
packageTypecomoapplication. - Os pacotes de conteúdo (mutáveis) devem definir seus
packageTypecomocontent.
Para obter mais informações, consulte Apache Jackrabbit FileVault - documentação do plug-in Package Maven, Tipos de pacote Apache Jackrabbit e o trecho de configuração FileVault Maven abaixo.
Marcação de pacotes para implantação pelo Adobe Cloud Manager marking-packages-for-deployment-by-adoube-cloud-manager
Por padrão, o Adobe Cloud Manager coleta todos os pacotes produzidos pela compilação Maven. No entanto, como o pacote do contêiner (all) é o artefato de implantação singular que contém todos os pacotes de código e conteúdo, você deve garantir que somente o pacote do contêiner (all) seja implantado. Para garantir isso, outros pacotes gerados pela compilação Maven devem ser marcados com a configuração do Plug-in FileVault Content Package Maven do <properties><cloudManagerTarget>none</cloudManageTarget></properties>.
Inicialização do repositório repo-init
A Inicialização do repositório fornece instruções, ou scripts, que definem estruturas JCR, que variam de estruturas de nó comuns, como árvores de pastas, a usuários, usuários de serviço, grupos e definição de ACL.
Os principais benefícios do Repo Init são que eles têm permissões implícitas para executar todas as ações definidas por seus scripts. E esses scripts são chamados no início do ciclo de vida da implantação, garantindo que todas as estruturas JCR necessárias existam até o código ser executado.
Embora os scripts de Inicialização de repositório estejam no projeto ui.config como scripts, eles podem e devem ser usados para definir as seguintes estruturas mutáveis:
- Estruturas de conteúdo de linha de base
- Usuários do serviço
- Usuários
- Grupos
- ACLs
Os scripts de Inicialização de repositório são armazenados como scripts entradas de RepositoryInitializer configurações de fábrica OSGi. Dessa forma, eles podem ser direcionados implicitamente pelo modo de execução, permitindo diferenças entre o Autor do AEM e os scripts de Inicialização de repositório do AEM Publish Services ou até mesmo entre ambientes (Desenvolvimento, Preparo e Produção).
As configurações OSGi de Inicialização de repositório são escritas com êxito no .config formato de configuração OSGi, pois oferecem suporte a várias linhas, o que é uma exceção às práticas recomendadas de uso do .cfg.json para definir configurações OSGi.
Ao definir Usuários e Grupos, somente os grupos são considerados parte do aplicativo e parte integrante de sua função. Você ainda define Usuários e grupos da organização no tempo de execução no AEM. Por exemplo, se um fluxo de trabalho personalizado atribuir trabalho a um Grupo nomeado, defina esse Grupo por meio da Inicialização de repositório no aplicativo do AEM. No entanto, se o Agrupamento é meramente organizacional, como "Wendy's Team" e "Sean's Team", esses grupos são melhor definidos e gerenciados no tempo de execução no AEM.
scripts embutido ou a configuração references não funciona.O vocabulário completo para scripts de inicialização de repositório está disponível na documentação de inicialização de repositório do Apache Sling.
Pacote de estrutura do repositório repository-structure-package
Os pacotes de código exigem a configuração do plug-in FileVault Maven para referenciar um <repositoryStructurePackage> que imponha a correção de dependências estruturais (para garantir que um pacote de código não seja instalado sobre outro). Você pode criar seu próprio pacote de estrutura de repositório para o projeto.
Necessário somente para pacotes de código, ou seja, qualquer pacote marcado com <packageType>application</packageType>.
Para saber como criar um pacote de estrutura de repositório para seu aplicativo, consulte Desenvolver um Pacote de Estrutura de Repositório.
Os pacotes de conteúdo (<packageType>content</packageType>) não exigem esse Pacote de estrutura de repositório.
Incorporação de subpacotes no pacote de container embeddeds
O conteúdo ou os pacotes de código são colocados em uma pasta especial de "carro lateral" e podem ser direcionados para instalação no autor do AEM, na publicação do AEM ou em ambos, usando a configuração <embeddeds> do plug-in FileVault Maven. Não use a configuração <subPackages>.
Casos de uso comuns incluem:
- ACLs/permissões que diferem entre os usuários autores do AEM e os usuários de publicação do AEM
- Configurações usadas para oferecer suporte a atividades somente no autor do AEM
- Código, como integrações com sistemas de back-office, necessário apenas para execução no autor do AEM
Para direcionar o autor do AEM, o AEM publica ou ambos, o pacote é incorporado no pacote de contêiner all em um local de pasta especial, no seguinte formato:
/apps/<app-name>-packages/(content|application|container)/install(.author|.publish)?
Analisando a estrutura desta pasta:
-
A pasta de primeiro nível deve ser
/apps. -
A pasta de segundo nível representa o aplicativo com
-packagespós-corrigido para o nome da pasta. Geralmente, há apenas uma única pasta de segundo nível em que todos os subpacotes são incorporados. No entanto, qualquer número de pastas de segundo nível pode ser criada para melhor representar a estrutura lógica do aplicativo:/apps/my-app-packages/apps/my-other-app-packages/apps/vendor-packages
note warning WARNING Por convenção, as pastas incorporadas do subpacote são nomeadas com o sufixo -packages. Esse nome garante que o código de implantação e os pacotes de conteúdo sejam não implantados nas pastas de destino de qualquer subpacote/apps/<app-name>/..., o que resulta em comportamento de instalação destrutivo e cíclico. -
A pasta de terceiro nível deve ser
application,contentoucontainer- A pasta
applicationcontém pacotes de código - A pasta
contentcontém pacotes de conteúdo - A pasta
containercontém pacotes de aplicativos extras que podem ser incluídos pelo aplicativo AEM.
Este nome de pasta corresponde aos tipos de pacote dos pacotes que ele contém.
- A pasta
-
A pasta de 4º nível contém os subpacotes e deve ser uma das seguintes:
installpara que você instale em o autor do AEM e a publicação do AEMinstall.authorpara instalar somente no autor do AEMinstall.publishpara instalar somente na publicação do AEM
Somenteinstall.authoreinstall.publishsão destinos com suporte. Outros modos de execução não são compatíveis.
Por exemplo, uma implantação que contém pacotes específicos do autor e da publicação do AEM pode ser semelhante ao seguinte:
-
O pacote de contêiner
allincorpora os seguintes pacotes, para criar um artefato de implantação singular- O
ui.appsincorporado no/apps/my-app-packages/application/installimplanta o código para o autor do AEM e para a publicação do AEM ui.apps.authorincorporado em/apps/my-app-packages/application/install.authorimplanta o código somente para o autor do AEM- O
ui.contentincorporado ao/apps/my-app-packages/content/installimplanta conteúdo e configuração para o autor do AEM e para a publicação do AEM - O
ui.content.publishincorporado no/apps/my-app-packages/content/install.publishimplanta conteúdo e configuração somente para publicação do AEM
- O
Definição de filtro do pacote de contêiner container-package-filter-definition
Devido à incorporação dos subpacotes de código e conteúdo no pacote de contêiner, os caminhos de destino incorporados devem ser adicionados ao filter.xml do projeto do contêiner. Isso garante que os pacotes incorporados sejam incluídos no pacote de contêiner quando criados.
Basta adicionar as <filter root="/apps/<my-app>-packages"/> entradas para qualquer pasta de segundo nível que contenha subpacotes para implantar.
Incorporação de pacotes de terceiros embedding-3rd-party-packages
Todos os pacotes devem estar disponíveis por meio do repositório público de artefatos Maven da Adobe ou de um repositório de artefatos Maven de terceiros referenciável e público acessível.
Se os pacotes de terceiros estiverem no repositório público de artefatos Maven da Adobe, nenhuma configuração adicional será necessária para o Adobe Cloud Manager resolver os artefatos.
Se os pacotes de terceiros estiverem em um repositório público de artefatos Maven de terceiros, esse repositório deverá ser registrado no pom.xml do projeto e incorporado de acordo com o método descrito acima.
Aplicativo/conectores de terceiros devem ser incorporados usando seu pacote all como um contêiner no pacote do contêiner do projeto (all).
A adição de dependências do Maven segue as práticas padrão do Maven. A incorporação de artefatos de terceiros (pacotes de código e conteúdo) está descrita acima.
Dependências de Pacote entre o ui.apps de ui.content Pacotes package-dependencies
Para garantir a instalação adequada dos pacotes, é recomendável que as dependências entre pacotes sejam estabelecidas.
A regra geral é que os pacotes com conteúdo mutável (ui.content) devem depender do código imutável (ui.apps) que dá suporte à renderização e ao uso do conteúdo mutável.
Uma exceção notável a essa regra geral é se o pacote de código imutável (ui.apps ou qualquer outro), somente contiver pacotes OSGi. Em caso afirmativo, nenhum pacote do AEM deve declarar uma dependência nele. O motivo é porque pacotes de código imutáveis que only contêm pacotes OSGi não estão registrados no Gerenciador de Pacotes do AEM. Portanto, qualquer pacote do AEM que dependa dele tem uma dependência insatisfeita e não é instalado.
Os padrões comuns para dependências de pacote de conteúdo são:
Dependências do Pacote de Implantação Simples simple-deployment-package-dependencies
O caso simples define o pacote de conteúdo mutável ui.content para depender do pacote de código imutável ui.apps.
-
allnão tem dependênciasui.appsnão tem dependênciasui.contentdepende deui.apps
Dependências complexas do pacote de implantação complex-deploxment-package-dependencies
Implantações complexas se expandem no caso simples e definem dependências entre o conteúdo mutável correspondente e pacotes de código imutáveis. Conforme necessário, as dependências também podem ser estabelecidas entre pacotes de código imutáveis.
-
allnão tem dependênciascommon.ui.apps.commonnão tem dependênciassite-a.ui.appsdepende decommon.ui.appssite-a.ui.contentdepende desite-a.ui.appssite-b.ui.appsdepende decommon.ui.appssite-b.ui.contentdepende desite-b.ui.apps
Desenvolvimento e implantação local local-development-and-deployment
As estruturas e a organização do projeto descritas neste artigo são totalmente compatíveis com as instâncias de desenvolvimento locais do AEM.
Trechos XML POM pom-xml-snippets
A seguir estão trechos de configuração do Maven pom.xml que podem ser adicionados aos projetos do Maven para se alinharem às recomendações acima.
Tipos de encapsulamento xml-package-types
Os pacotes de código e conteúdo, que são implantados como subpacotes, devem declarar um tipo de pacote de aplicativo ou conteúdo, dependendo do que eles contêm.
Tipos de pacote de contêiner container-package-types
O contêiner all/pom.xml projeto não declara um <packageType>.
Tipos de pacote de código (imutável) immutable-package-types
Os pacotes de código devem definir seu packageType como application.
No ui.apps/pom.xml, as diretivas de configuração de compilação <packageType>application</packageType> da declaração de plug-in filevault-package-maven-plugin declaram seu tipo de pacote.
...
<build>
<plugins>
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<group>${project.groupId}</group>
<name>my-app.ui.apps</name>
<packageType>application</packageType>
<accessControlHandling>merge</accessControlHandling>
<properties>
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
</configuration>
</plugin>
...
Tipos de encapsulamento de conteúdo (mutável) mutable-package-types
Os pacotes de conteúdo devem definir packageType como content.
No ui.content/pom.xml, a diretiva de configuração de compilação <packageType>content</packageType> da declaração de plug-in filevault-package-maven-plugin declara seu tipo de pacote.
...
<build>
<plugins>
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<group>${project.groupId}</group>
<name>my-app.ui.content</name>
<packageType>content</packageType>
<accessControlHandling>merge</accessControlHandling>
<properties>
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
</configuration>
</plugin>
...
Marcação de pacotes para implantação do Adobe Cloud Manager cloud-manager-target
Em todos os projetos que geram um pacote, exceto do projeto do contêiner (all), adicione <cloudManagerTarget>none</cloudManagerTarget> à configuração <properties> da declaração do plug-in filevault-package-maven-plugin para garantir que eles não sejam implantados pelo Adobe Cloud Manager. O pacote do contêiner (all) deve ser o único pacote implantado via Cloud Manager, que, por sua vez, incorpora todos os pacotes de código e conteúdo necessários.
...
<build>
<plugins>
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
...
<properties>
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
</configuration>
</plugin>
...
Inicialização do repositório snippet-repo-init
Os scripts de Inicialização de repositório que contêm os scripts de Inicialização de repositório são definidos na configuração de fábrica OSGi RepositoryInitializer por meio da propriedade scripts. Como esses scripts são definidos nas configurações de OSGi, eles podem ser facilmente definidos pelo modo de execução usando a semântica de pasta ../config.<runmode> usual.
Como os scripts geralmente são declarações de várias linhas, é mais fácil defini-los no arquivo .config do que no formato .cfg.json baseado em JSON.
/apps/my-app/config.author/org.apache.sling.jcr.repoinit.RepositoryInitializer-author.config
scripts=["
create service user my-data-reader-service
set ACL on /var/my-data
allow jcr:read for my-data-reader-service
end
create path (sling:Folder) /conf/my-app/settings
"]
A propriedade OSGi scripts contém diretivas conforme definidas pela linguagem de inicialização de repositório do Apache Sling.
Pacote de estrutura do repositório xml-repository-structure-package
No ui.apps/pom.xml e em qualquer outro pom.xml que declare um pacote de código (<packageType>application</packageType>), adicione a seguinte configuração de pacote de estrutura de repositório ao plug-in FileVault Maven. Você pode criar seu próprio pacote de estrutura de repositório para o projeto.
...
<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>
...
Incorporação de subpacotes no pacote de container xml-embeddeds
Em all/pom.xml, adicione as seguintes diretivas <embeddeds> à declaração de plug-in filevault-package-maven-plugin. Lembre-se, não use a configuração <subPackages>. O motivo é porque inclui os subpacotes em /etc/packages em vez de /apps/my-app-packages/<application|content|container>/install(.author|.publish)?.
...
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
...
<embeddeds>
<!-- Include the application's ui.apps and ui.content packages -->
<!-- Ensure the artifactIds are correct -->
<!-- OSGi Bundle Jar file that deploys to BOTH AEM Author and AEM Publish -->
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>my-app.core</artifactId>
<type>jar</type>
<target>/apps/my-app-packages/application/install</target>
</embedded>
<!-- Code package that deploys to BOTH AEM Author and AEM Publish -->
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>my-app.ui.apps</artifactId>
<type>zip</type>
<target>/apps/my-app-packages/application/install</target>
</embedded>
<!-- OSGi configuration code package that deploys to BOTH AEM Author and AEM Publish -->
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>my-app.ui.config</artifactId>
<type>zip</type>
<target>/apps/my-app-packages/application/install</target>
</embedded>
<!-- Code package that deploys ONLY to AEM Author -->
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>my-app.ui.apps.author</artifactId>
<type>zip</type>
<target>/apps/my-app-packages/application/install.author</target>
</embedded>
<!-- Content package that deploys to BOTH AEM Author and AEM Publish -->
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>my-app.ui.content</artifactId>
<type>zip</type>
<target>/apps/my-app-packages/content/install</target>
</embedded>
<!-- Content package that deploys ONLY to AEM Publish -->
<embedded>
<groupId>${project.groupId}</groupId>
<artifactId>my-app.ui.content.publish-only</artifactId>
<type>zip</type>
<target>/apps/my-app-packages/content/install.publish</target>
</embedded>
<!-- Include any other extra packages -->
<embedded>
<groupId>com.vendor.x</groupId>
<artifactId>vendor.plug-in.all</artifactId>
<type>zip</type>
<target>/apps/vendor-packages/container/install</target>
</embedded>
<embeddeds>
</configuration>
</plugin>
...
Definição de filtro do pacote de contêiner xml-container-package-filters
No all (filter.xml) do projeto all/src/main/content/jcr_root/META-INF/vault/definition/filter.xml, inclua qualquer pasta -packages que contenha subpacotes a serem implantados:
<filter root="/apps/my-app-packages"/>
Se vários /apps/*-packages forem usados nos destinos inseridos, todos eles deverão ser enumerados aqui.
Repositórios Maven de terceiros xml-3rd-party-maven-repositories
No pom.xml do projeto do reator, adicione quaisquer diretivas de repositório Maven públicas de terceiros necessárias. A configuração <repository> completa deve estar disponível no Provedor do Repositório de terceiros.
<repositories>
...
<repository>
<id>3rd-party-repository</id>
<name>Public Third-Party Repository</name>
<url>https://repo.3rdparty.example.com/...</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
...
</repositories>
Dependências de Pacote entre o ui.apps de ui.content Pacotes xml-package-dependencies
Em ui.content/pom.xml, adicione as seguintes diretivas <dependencies> à declaração de plug-in filevault-package-maven-plugin.
...
<plugin>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>filevault-package-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
...
<dependencies>
<!-- Declare the content package dependency in the ui.content/pom.xml on the ui.apps project -->
<dependency>
<groupId${project.groupId}</groupId>
<artifactId>my-app.ui.apps</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
...
</configuration>
</plugin>
...
Limpando a pasta de destino do projeto do contêiner xml-clean-container-package
No all/pom.xml, adicione o plug-in maven-clean-plugin, que limpa o diretório de destino antes de uma compilação Maven.
<plugins>
...
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<executions>
<execution>
<id>auto-clean</id>
<!-- Run at the beginning of the build rather than the default, which is after the build is done -->
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>