AEM 프로젝트 구조

이 문서가 이러한 학습 및 개념을 기반으로 작성되므로 기본 AEM Project Archetype 사용FileVault Content Maven 플러그인에 대해 숙지하십시오.

이 문서에서는 변경 가능한 컨텐츠와 변경할 수 없는 컨텐츠 분리를 사용하여 Adobe Experience Manager Maven 프로젝트에 필요한 변경 사항을 설명하고, 상충되는 배포가 없도록 종속성을 설정하고, 배포 가능한 구조로 패키지되어 있다는 점을 확인하여 호환되는 Cloud Service으로 AEM에 필요한 변경 사항을 설명합니다.

AEM 애플리케이션 배포는 단일 AEM 패키지로 구성되어야 합니다. 따라서 이 패키지에는 코드, 구성 및 지원 기준선 컨텐츠를 포함하여 응용 프로그램이 작동하는 데 필요한 모든 것을 구성하는 하위 패키지가 들어 있어야 합니다.

AEM에서는 content코드​를 분리해야 합니다. 즉, 단일 컨텐츠 패키지 ​모두​/apps 및 런타임 쓰기 가능 영역(예:리포지토리의 /content, /conf, /home 또는 /apps)가 아닌 것. 대신 AEM에 배포하려면 애플리케이션에서 코드와 컨텐츠를 개별 패키지로 분리해야 합니다.

이 문서에 설명된 패키지 구조는 로컬 개발 배포 및 AEM Cloud Service 배포과 호환됩니다.

이 문서에 요약된 구성은 AEM Project Maven Archetype 24 이상에서 제공합니다.

변경 가능한 영역과 저장소의 변경할 수 없는 영역

/apps/libs는 AEM이 시작된 후(예: 런타임 시) 변경(만들기, 업데이트, 삭제)할 수 없으므로 AEM에서 변경할 수 없는 영역으로 간주됩니다. 런타임 시 변경할 수 없는 영역을 변경하려고 하면 오류가 발생합니다.

저장소의 다른 모든 항목, /content, /conf, /var, /etc, /oak:index, /system, /tmp 등. 모두 변경할 수 있는 영역입니다. 즉, 런타임 시 변경할 수 있습니다.

경고

이전 AEM 버전과 마찬가지로 /libs은 수정하면 안 됩니다. AEM 제품 코드만 /libs에 배포할 수 있습니다.

Oak 인덱스

Oak 인덱스(/oak:index)는 특별히 AEM에서 Cloud Service 배포 프로세스로 관리됩니다. 새 코드 이미지로 전환하기 전에 Cloud Manager가 새 인덱스가 배포되고 완전히 다시 색인화될 때까지 기다려야 하기 때문입니다.

이러한 이유로 런타임 시 Oak 인덱스를 변경할 수 있지만 변경 가능한 패키지를 설치하기 전에 설치할 수 있도록 코드를 배포해야 합니다. 따라서 /oak:index 구성은 아래의 설명에 따라 코드 패키지의 일부이며 컨텐츠 패키지 의 일부가 아닙니다.

AEM as a Cloud Service에서 색인화에 대한 자세한 내용은 컨텐츠 검색 및 색인 지정 문서를 참조하십시오.

Experience Manager 프로젝트 패키지 구조

이 다이어그램은 권장되는 프로젝트 구조 및 패키지 배포 아티팩트에 대한 개요를 제공합니다.

권장되는 애플리케이션 배포 구조는 다음과 같습니다.

코드 패키지/OSGi 번들

  • OSGi 번들 Jar 파일이 생성되어 모든 프로젝트에 직접 포함됩니다.

  • ui.apps 패키지에는 배포할 모든 코드가 포함되어 있으며 /apps에만 배포됩니다. ui.apps 패키지의 일반적인 요소는 포함되지만 다음 항목에 제한되지 않습니다.

    • 구성 요소 정의 및 HTLscripts
      • /apps/my-app/components
    • JavaScript 및 CSS(클라이언트 라이브러리를 통해)
      • /apps/my-app/clientlibs
    • 🔗 오버레이 /libs
      • /apps/cq, /apps/dam/, 등이 됩니다.
    • 대체 컨텍스트 인식 구성
      • /apps/settings
    • ACL(권한)
      • /apps 아래의 경로에 대해 모두 rep:policy
  • ui.config 패키지에는 모든 OSGi 구성이 들어 있습니다.

    • 실행 모드별 OSGi 구성 정의를 포함하는 조직 폴더
      • /apps/my-app/osgiconfig
    • 모든 target AEM에 Cloud Service 배포 대상으로 적용되는 기본 OSGi 구성이 들어 있는 일반적인 OSGi 구성 폴더
      • /apps/my-app/osgiconfig/config
    • 모든 target AEM에 Cloud Service 배포 대상으로 적용되는 기본 OSGi 구성을 포함하는 모드별 OSGi 구성 폴더를 실행합니다
      • /apps/my-app/osgiconfig/config.<author|publish>.<dev|stage|prod>
    • Repo 초기화 OSGi 구성 스크립트
      • Repo AEM 응용 프로그램의 논리적 일부인 (가변) 컨텐츠를 배포하는 권장 방법을 시작합니다. Repo Init OSGi 구성은 위에 요약된 대로 적절한 config.<runmode> 폴더에 있어야 하며 다음을 정의하는 데 사용해야 합니다.
        • 기준선 컨텐츠 구조
        • 사용자
        • 서비스 사용자
        • 그룹
        • ACL(권한)
노트

동일한 코드를 모든 환경에 배포해야 합니다. 스테이지 환경에서도 신뢰 검증 수준을 프로덕션에 유지하기 위해 필요합니다. 자세한 내용은 실행 모드의 섹션을 참조하십시오.

컨텐츠 패키지

  • ui.content 패키지에는 모든 콘텐츠 및 구성이 들어 있습니다. 컨텐츠 패키지에는 ui.apps 또는 ui.config 패키지에 없는 모든 노드 정의가 들어 있거나, 즉 /apps 또는 /oak:index에 없는 노드 정의가 들어 있습니다. ui.content 패키지의 일반적인 요소는 포함되지만 다음 항목에 제한되지 않습니다.
    • 컨텍스트 인식 구성
      • /conf
    • 필수, 복잡한 컨텐츠 구조(예: Repo Init에 정의된 이전 Baseline 컨텐츠 구조를 기반으로 빌드되고 확장하는 컨텐츠 작성입니다.)
      • /content, /content/dam, 등이 됩니다.
    • 관리되는 태깅 분류
      • /content/cq:tags
    • 레거시 etc 노드(이상적으로는 비/etc 위치로 마이그레이션)
      • /etc

컨테이너 패키지

  • all 패키지는 배포 가능한 객체, OSGI 번들 Jar 파일, ui.apps, ui.configui.content 패키지만 포함된 컨테이너 패키지입니다. all 패키지에는 어떤 컨텐츠 또는 코드​도 들어 있지 않고, 모든 배포를 하위 패키지 또는 OSGi 번들 Jar 파일에 리포지토리에 위임해야 합니다.

    이제 패키지는 <subPackages> 구성 대신 Maven FileVault Package Maven 플러그인의 포함된 구성을 사용하여 포함됩니다.

    복잡한 Experience Manager 배포의 경우 AEM에서 특정 사이트 또는 테넌트를 나타내는 여러 ui.apps, ui.configui.content 프로젝트/패키지를 만드는 것이 좋을 수 있습니다. 이 작업이 수행되면 변경 가능한 컨텐츠와 변경할 수 없는 컨텐츠 간의 분할이 준수되도록 하고 필요한 컨텐츠 패키지 및 OSGi 번들 Jar 파일은 all 컨테이너 컨텐츠 패키지에 하위 패키지로 포함됩니다.

    예를 들어 다음과 같은 복잡한 배포 컨텐츠 패키지 구조가 있을 수 있습니다.

    • all 컨텐츠 패키지에는 단일 배포 아티팩트를 만들기 위해 다음 패키지가 포함됩니다
      • common.ui.apps 사이트 A와 ​사이트 B 모두에 필요한 코드를 배포합니다.
      • site-a.core 사이트 A에 필요한 OSGi 번들 Jar
      • site-a.ui.apps 사이트 A에 필요한 코드를 배포합니다.
      • site-a.ui.config 사이트 A에 필요한 OSGi 구성을 배포합니다.
      • site-a.ui.content 사이트 A에 필요한 컨텐츠 및 구성을 배포합니다.
      • site-b.core 사이트 B에 필요한 OSGi 번들 Jar
      • site-b.ui.apps 사이트 B에 필요한 코드를 배포합니다.
      • site-b.ui.config 사이트 B에 필요한 OSGi 구성을 배포합니다.
      • site-b.ui.content 사이트 B에 필요한 컨텐츠 및 구성 배포

추가 응용 프로그램 패키지

자체 코드 및 컨텐츠 패키지로 구성된 다른 AEM 프로젝트를 AEM 배포에서 사용하는 경우 해당 컨테이너 패키지를 프로젝트의 all 패키지에 포함해야 합니다.

예를 들어 2개의 공급업체 AEM 애플리케이션을 포함하는 AEM 프로젝트는 다음과 같을 수 있습니다.

  • all 컨텐츠 패키지에는 단일 배포 아티팩트를 만들기 위해 다음 패키지가 포함됩니다
    • core AEM 애플리케이션에 필요한 OSGi 번들 Jar
    • ui.apps AEM 응용 프로그램에 필요한 코드를 배포합니다.
    • ui.config AEM 애플리케이션에 필요한 OSGi 구성을 배포합니다.
    • ui.content AEM 애플리케이션에서 필요한 컨텐츠 및 구성을 배포합니다.
    • vendor-x.all 공급업체 X 애플리케이션에 필요한 모든 것(코드 및 컨텐츠)을 배포합니다.
    • vendor-y.all 공급업체 Y 애플리케이션에 필요한 모든 것(코드 및 컨텐츠)을 배포합니다.

패키지 유형

패키지는 선언된 패키지 유형으로 표시됩니다.

  • 컨테이너 패키지는 packageTypecontainer(으)로 설정해야 합니다. 컨테이너 패키지에는 OSGi 번들, OSGi 구성이 직접 들어 있지 않아야 하며 설치 후크를 사용할 수 없습니다.
  • 코드(변경할 수 없음) 패키지는 packageTypeapplication로 설정해야 합니다.
  • 콘텐츠(가변) 패키지는 packageTypecontent(으)로 설정해야 합니다.

자세한 내용은 아래의 Apache Jackrabbit FileVault - Package Maven 플러그인 설명서FileVault Maven 구성 코드 조각을 참조하십시오.

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

Adobe Cloud Manager의 배포를 위한 패키지 표시

기본적으로 Adobe Cloud Manager는 Maven 빌드에서 생성된 모든 패키지를 회수하지만 컨테이너(all) 패키지는 모든 코드 및 컨텐츠 패키지를 포함하는 단일 배포 아티팩트이므로, 컨테이너(all) 패키지가 배포되도록 해야 합니다. 이를 위해 Maven 빌드가 생성하는 다른 패키지는 <properties><cloudManagerTarget>none</cloudManageTarget></properties>의 FileVault Content Package Maven 플러그인 구성으로 표시되어야 합니다.

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

Repo Init

Repo Init는 폴더 트리와 같은 공통 노드 구조에서 사용자, 서비스 사용자, 그룹 및 ACL 정의에 이르기까지 JCR 구조를 정의하는 지침 또는 스크립트를 제공합니다.

Repo Init의 주요 이점은 스크립트로 정의된 모든 작업을 수행할 수 있는 암시적 권한이 있으며 배포 주기 초기에 호출되어 시간 코드가 실행될 때까지 모든 필수 JCR 구조가 존재함을 보장합니다.

Repo Init 스크립트는 ui.config 프로젝트에서 스크립트로 사용되지만 다음 변경 가능한 구조를 정의하는 데 사용할 수 있으며 사용해야 합니다.

  • 기준선 컨텐츠 구조
  • 서비스 사용자
  • 사용자
  • 그룹
  • ACL

Repo Init 스크립트는 RepositoryInitializer OSGi 공장 구성의 scripts 항목으로 저장되므로 실행 모드에서 암시적으로 타겟팅할 수 있으므로 AEM Author와 AEM Publish Services의 Repo Init 스크립트 또는 환경(Dev, Stage 및 Prod) 간에 차이가 발생할 수 있습니다.

Repo Init OSGi 구성은 .config OSGi 구성 형식에 가장 잘 기록되며, 이는 .cfg.json 를 사용하여 OSGi 구성을 정의하는 우수 사례에 대한 예외입니다.

사용자 및 그룹을 정의할 때 그룹만 애플리케이션의 일부로 간주되며, 기능에 필수 불가결한 요소만 여기에서 정의해야 합니다. 조직 사용자 및 그룹은 여전히 AEM에서 런타임 시 정의되어야 합니다.예를 들어, 사용자 지정 워크플로우가 이름이 지정된 그룹에 작업을 할당하는 경우 해당 그룹은 AEM 애플리케이션에서 Repo Init를 통해 정의해야 하지만 그룹화가 "Wendy's Team" 및 "Sean's Team"과 같은 조직적 구성일 경우 AEM에서 런타임 시 가장 잘 정의되고 관리됩니다.

Repo Init 스크립트 는 인라인 scripts 필드에​을 정의해야 하며 references 구성이 작동하지 않습니다.

Repo Init 스크립트의 전체 어휘는 Apache Sling Repo Init 설명서에서 사용할 수 있습니다.

전체 코드 조각에 대해서는 아래의 Repo Init Scopes 섹션을 참조하십시오.

저장소 구조 패키지

코드 패키지를 사용하려면 구조적 종속성을 적용하는 <repositoryStructurePackage>을 참조하도록 FileVault Maven 플러그인의 구성을 구성해야 합니다(한 코드 패키지가 다른 코드 패키지를 설치하지 않도록 함). 프로젝트에 대해 고유한 저장소 구조 패키지를 만들 수 있습니다.

이는 코드 패키지에 필요한​만 필요합니다. 이것은 <packageType>application</packageType>로 표시된 패키지를 의미합니다.

응용 프로그램에 대한 저장소 구조 패키지를 만드는 방법에 대해 알아보려면 저장소 구조 패키지 개발을 참조하십시오.

컨텐츠 패키지(<packageType>content</packageType>) 에는 이 저장소 구조 패키지가 필요하지 않습니다.

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

컨테이너 패키지에 하위 패키지 포함

컨텐츠 또는 코드 패키지는 특수 "사이드 카" 폴더에 배치되며 FileVault Maven 플러그인의 <embeddeds> 구성을 사용하여 AEM 작성자, AEM 게시 또는 둘 다에 설치하기 위해 타깃팅할 수 있습니다. <subPackages> 구성은 사용하지 않아야 합니다.

일반적인 사용 사례는 다음과 같습니다.

  • AEM 작성자 사용자와 AEM 게시 사용자 간에 다른 ACL/권한
  • AEM 작성자의 활동만 지원하는 데 사용되는 구성
  • 백 오피스 시스템과의 통합과 같은 코드는 AEM 작성자에서만 실행하는 데 필요합니다

패키지 포함

AEM 작성자, AEM 게시 또는 둘 다 타깃팅하려면 패키지가 all 컨테이너 패키지에 다음 형식의 특수 폴더 위치에 포함됩니다.

/apps/<app-name>-packages/(content|application|container)/install(.author|.publish)?

이 폴더 구조 분류:

  • 첫 번째 수준 폴더 은(는) /apps여야 합니다.

  • 두 번째 수준 폴더는 폴더 이름에 대한 -packages 이후 고정이 있는 응용 프로그램을 나타냅니다. 모든 하위 패키지가 포함된 단일 2차 수준 폴더만 있는 경우가 많지만, 애플리케이션의 논리 구조를 가장 잘 나타내도록 두 번째 수준 폴더를 만들 수 있습니다.

    • /apps/my-app-packages
    • /apps/my-other-app-packages
    • /apps/vendor-packages
    경고

    규칙에 따라 하위 패키지 포함 폴더의 이름은 -packages 접미사로 지정됩니다. 이렇게 하면 배포 코드 및 컨텐츠 패키지가 하위 패키지 /apps/<app-name>/...의 대상 폴더를 배포하지 않고 파괴적이고 순환 설치 동작이 발생합니다.

  • 세 번째 수준 폴더는 다음 중 하나여야 합니다.
    application, content 또는 container

    • application 폴더에는 코드 패키지가 있습니다
    • content 폴더에는 컨텐츠 패키지가 들어 있습니다
    • container 폴더에는 AEM 애플리케이션에서 포함할 수 있는 추가 응용 프로그램 패키지가 있습니다.
      이 폴더 이름은 포함된 패키지의 패키지 유형에 해당합니다.
  • 4번째 수준 폴더에는 하위 패키지가 들어 있으며 다음 중 하나여야 합니다.

    • install aem 작성자 및 AEM ​게시 모두에 설치하려면
    • install.author AEM ​작성자에만 설치하려면
    • install.publish AEM ​게시에만 설치하려면 install.author 및 만 지원되는 install.publish 타겟이 있어야 합니다. 다른 실행 모드 ​지원되지 않습니다.

예를 들어 AEM 작성자 및 게시 특정 패키지가 들어 있는 배포는 다음과 같을 수 있습니다.

  • all 컨테이너 패키지에는 단일 배포 아티팩트를 만들기 위해 다음 패키지가 포함됩니다
    • ui.apps/apps/my-app-packages/application/install 포함됨 코드를 AEM 작성자 및 AEM 게시 모두에 배포합니다.
    • ui.apps.author/apps/my-app-packages/application/install.author 포함되며 코드를 AEM 작성자에게만 배포
    • ui.content/apps/my-app-packages/content/install 포함됨 컨텐츠를 배포하고 구성을 AEM 작성자 및 AEM 게시에 모두 배포
    • ui.content.publish/apps/my-app-packages/content/install.publish 포함됨: 컨텐츠 및 구성을 AEM 게시에만 배포

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

컨테이너 패키지의 필터 정의

컨테이너 패키지에 코드 및 컨텐츠 하위 패키지가 포함되므로, 포함된 대상 경로를 컨테이너 프로젝트의 filter.xml에 추가해야 내장 패키지가 컨테이너 패키지에 포함되도록 할 수 있습니다.

배포할 하위 패키지가 들어 있는 두 번째 수준 폴더에 대해 <filter root="/apps/<my-app>-packages"/> 항목을 추가하면 됩니다.

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

타사 패키지 포함

모든 패키지는 Adobe의 공용 Maven 아티팩트 저장소 또는 액세스 가능한 공개 참조 가능한 타사 Maven 아티팩트 저장소를 통해 사용할 수 있어야 합니다.

타사 패키지가 Adobe의 public Maven 아티팩트 저장소​에 있는 경우 Cloud Manager에서 아티팩트를 해결하는 데 더 이상 구성이 필요하지 않습니다.

타사 패키지가 공용 타사 Maven 아티팩트 저장소​에 있는 경우, 이 리포지토리는 프로젝트의 pom.xml에 등록되고 위에 요약된 메서드에 따라 포함되어야 합니다.

타사 애플리케이션/커넥터는 all 패키지를 프로젝트의 컨테이너(all) 패키지의 컨테이너로 사용하여 포함해야 합니다.

Maven 종속성을 추가하는 것은 표준 Maven 관행을 따르며, 타사 아티팩트(코드 및 콘텐츠 패키지)를 포함하는 방법은 위에 요약되어 있습니다.

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

ui.content 패키지의 ui.apps 패키지 종속성

패키지를 제대로 설치하려면 패키지 간 종속성을 설정하는 것이 좋습니다.

일반 규칙은 가변 콘텐츠(ui.content)를 포함하는 패키지에서 가변 콘텐츠 렌더링 및 사용을 지원하는 변경할 수 없는 코드(ui.apps)에 따라 달라야 합니다.

이 일반 규칙의 주목할 만한 예외 사항은 변경할 수 없는 코드 패키지(ui.apps 또는 기타 모든), 에만 OSGi 번들이 포함되어 있는 경우입니다. 그럴 경우 AEM 패키지가 종속성을 선언하지 않아야 합니다. 이는 변경할 수 없는 코드 패키지 OSGi 번들이 포함된​만 AEM Package Manager에 등록되지 않았으므로, 이에 따라 모든 AEM 패키지는 충족되지 않은 종속성을 가지며, 설치하지 못합니다.

전체 코드 조각은 아래의 POM XML 코드 조각 섹션을 참조하십시오.

컨텐츠 패키지 종속성에 대한 일반적인 패턴은 다음과 같습니다.

단순 배포 패키지 종속성

단순 케이스는 ui.apps 변경할 수 없는 코드 패키지에 종속되도록 ui.content 가변 컨텐츠 패키지를 설정합니다.

  • all 종속성이 없습니다.
    • ui.apps 종속성이 없습니다.
    • ui.content 종속됨 ui.apps

복잡한 배포 패키지 종속성

복잡한 배포는 간단한 사례에 따라 확장되며 해당 가변 콘텐츠와 변경할 수 없는 코드 패키지 간에 종속성을 설정합니다. 필요에 따라 변경할 수 없는 코드 패키지 간에 종속성을 설정할 수도 있습니다.

  • all 종속성이 없습니다.
    • common.ui.apps.common 종속성이 없습니다.
    • site-a.ui.apps 종속됨 common.ui.apps
    • site-a.ui.content 종속됨 site-a.ui.apps
    • site-b.ui.apps 종속됨 common.ui.apps
    • site-b.ui.content 종속됨 site-b.ui.apps

로컬 개발 및 배포

이 문서에 설명된 프로젝트 구조 및 조직은 완전히 호환되는 로컬 개발 AEM 인스턴스입니다.

POM XML 코드 조각

다음은 위의 권장 사항에 맞게 Maven 프로젝트에 추가할 수 있는 Maven pom.xml 구성 조각입니다.

패키지 유형

하위 패키지로 배포되는 코드 및 콘텐츠 패키지는 포함된 내용에 따라 application 또는 content​의 패키지 유형을 선언해야 합니다.

컨테이너 패키지 유형

all/pom.xml 프로젝트 에서​가 <packageType>을 선언하지 않습니다.

코드(변경할 수 없음) 패키지 유형

코드 패키지는 packageTypeapplication(으)로 설정해야 합니다.

ui.apps/pom.xml에서 filevault-package-maven-plugin 플러그인 선언의 <packageType>application</packageType> 빌드 구성 지시문은 해당 패키지 유형을 선언합니다.

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

컨텐츠(가변) 패키지 유형

컨텐츠 패키지는 packageTypecontent(으)로 설정해야 합니다.

ui.content/pom.xml에서 filevault-package-maven-plugin 플러그인 선언의 <packageType>content</packageType> 빌드 구성 지시문은 해당 패키지 유형을 선언합니다.

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

Adobe Cloud Manager 배포에 대한 패키지 표시

패키지를 생성하는 모든 프로젝트에서 컨테이너(all) 프로젝트에 대해 을(를) 제외한​에서 <cloudManagerTarget>none</cloudManagerTarget>filevault-package-maven-plugin 플러그인 선언의 <properties> 구성에 추가하여 이 Cloud Manager에서 배포하지 않도록 합니다. 컨테이너(all) 패키지는 Cloud Manager를 통해 배포되는 단일 패키지여야 하며, 이때 모든 필수 코드 및 컨텐츠 패키지가 포함됩니다.

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

Repo Init

Repo Init 스크립트가 포함된 Repo Init 스크립트는 RepositoryInitializer OSGi 공장 구성에 scripts 속성을 통해 정의됩니다. OSGi 구성 내에 정의된 이러한 스크립트는 일반적인 ../config.<runmode> 폴더 의미 체계를 사용하여 실행 모드로 쉽게 범위가 지정할 수 있습니다.

스크립트는 일반적으로 여러 줄 선언이므로 JSON 기반 .cfg.json 형식보다 .config 파일에서 스크립트를 정의하는 것이 더 쉽습니다.

/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
"]

scripts OSGi 속성은 Apache Sling의 Repo Init 언어에 의해 정의된 지시어를 포함합니다.

저장소 구조 패키지

코드 패키지(<packageType>application</packageType>)를 선언하는 ui.apps/pom.xml 및 다른 pom.xml에서 다음 저장소 구조 패키지 구성을 FileVault 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>
    ...

컨테이너 패키지에 하위 패키지 포함

all/pom.xml에서 다음 <embeddeds> 지시어를 filevault-package-maven-plugin 플러그인 선언에 추가합니다. /apps/my-app-packages/<application|content|container>/install(.author|.publish)?이 아닌 /etc/packages에 하위 패키지를 포함하므로 <subPackages> 구성을 사용하지 마십시오.

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

컨테이너 패키지의 필터 정의

all 프로젝트의 filter.xml(all/src/main/content/jcr_root/META-INF/vault/definition/filter.xml)에서 배포할 하위 패키지가 들어 있는 -packages 폴더를 포함하십시오.

<filter root="/apps/my-app-packages"/>

포함된 대상에서 여러 개의 /apps/*-packages을 사용하는 경우 모두 여기에서 열거해야 합니다.

타사 Maven 저장소

경고

추가 Maven 리포지토리가 종속성을 확인하므로 추가 Maven 저장소를 추가하면 maven 빌드 시간을 연장할 수 있습니다.

반응기 프로젝트의 pom.xml에서 필요한 타사 public Maven 저장소 지시어를 추가합니다. 전체 <repository> 구성은 타사 저장소 공급자에서 사용할 수 있어야 합니다.

<repositories>
  ...
  <repository>
      <id>3rd-party-repository</id>
      <name>Public 3rd 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>

ui.content 패키지의 ui.apps 패키지 종속성

ui.content/pom.xml에서 다음 <dependencies> 지시어를 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>
...

컨테이너 프로젝트의 Target 폴더을(를) 정리하는 중

all/pom.xml에서 Maven 빌드 전에 대상 디렉터리를 지울 maven-clean-plugin 플러그인을 추가합니다.

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

추가 리소스

이 페이지에서는