AEM 專案結構

TIP
熟悉基本的AEM Project Archetype useFileVault Content Maven外掛程式,因為本文將以這些學問和概念為基礎。

本文概述讓Adobe Experience Manager Maven專案與AEM as a Cloud Service相容所需的變更,確保專案遵守可變和不可變內容的分割。 此外,相依性會建立為建立不衝突、確定性的部署,並封裝成可部署結構。

AEM應用程式部署必須由單一AEM套件組成。 此套件繼而應包含子套件,這些子套件包含應用程式運作所需的一切,包括程式碼、設定及任何支援的基準線內容。

AEM需要將​ 內容 ​和​ 程式碼 ​分開,這表示單一內容套件​ 無法 ​部署至存放庫的​ 同時 /apps和執行階段可寫入區域(例如,/content/conf/home或任何非/apps區域)。 而應用程式必須將程式碼和內容分隔為獨立套件,以便部署至AEM。

本檔案中概述的套件結構與本機開 發部署 和AEM cloud服務部署都相容。

TIP
本檔案中概述的設定是由AEM Project Maven Archetype 24或更新版本提供。

存放庫的可變與不可變區域 mutable-vs-immutable

AEM的/apps/libs區域視為​ 不可變,因為在AEM啟動(亦即執行階段)後就無法變更(建立、更新、刪除)。 任何在執行階段變更不可變區域的嘗試都會失敗。

存放庫中的所有其他專案(/content/conf/var/etc/oak:index/system/tmp等等)都是​ 可變 ​區域,這表示可在執行階段變更這些區域。

WARNING
如同舊版AEM一樣,/libs不應修改。 只有AEM產品程式碼可以部署至/libs

Oak索引 oak-indexes

Oak索引(/oak:index)由AEM as a Cloud Service部署程式管理。 這是因為Cloud Manager必須等到任何新索引部署並完全重新索引後,才能切換至新程式碼影像。

因此,雖然Oak索引在執行階段是可變的,但是它們必須部署為程式碼,以便在安裝任何可變套件之前可以安裝。 因此/oak:index設定是程式碼封裝的一部分,而不是如下所述🔗的內容封裝的一部分。

TIP
如需AEM as a Cloud Service索引的詳細資訊,請參閱內容搜尋與索引

Experience Manager的專案封裝結構

此圖表提供建議的專案結構和套件部署成品概觀。

建議的應用程式部署結構如下:

程式碼套件/ OSGi套件組合

  • 會產生OSGi套件Jar檔案,並直接內嵌於所有專案中。

  • ui.apps封裝包含要部署的所有程式碼,且僅部署至/appsui.apps封裝的通用元素包含但不限於:

NOTE
所有環境都必須部署相同的程式碼。 此程式碼可確保將預備環境上的驗證也用於生產環境的信賴等級。 如需詳細資訊,請參閱執行模式的區段。

內容封裝

  • ui.content封裝包含所有內容和組態。 內容封裝包含不在ui.appsui.config封裝中的所有節點定義,換句話說,包含不在/apps/oak:index中的所有節點定義。 ui.content封裝的通用元素包含但不限於:

    • 內容感知設定
      • /conf
    • 必要的複雜內容結構(亦即,建置並延伸超過存放庫初始中定義的基準內容結構的內容建置)。
      • /content/content/dam等。
    • 控管的標籤分類
      • /content/cq:tags
    • 舊版ETC節點(理想情況下,請將這些節點移轉至非/etc位置)
      • /etc

容器封裝

  • all封裝是容器封裝,僅包含可部署的成品、OSGI組合Jar檔案、ui.appsui.config以及ui.content封裝作為內嵌。 all封裝不得具有​ 任何內容或自己的程式碼,而是將所有部署委派給儲存庫的子封裝或OSGi套件組合Jar檔案。

    套件現在包含使用Maven FileVault Package Maven外掛程式的內嵌組態,而非<subPackages>組態。

    對於複雜的Experience Manager部署,最好在AEM中建立代表特定網站或租使用者的多個ui.appsui.configui.content專案/套件。 如果完成此方法,請確保遵循可變和不可變內容之間的分割,並將必要的內容套件和OSGi套件Jar檔案嵌入為all容器內容套件中的子套件。

    例如,複雜的部署內容套件結構可能如下所示:

    • all內容套件內嵌下列套件,以建立單一部署成品

      • common.ui.apps部署​ 網站A和網站B都需要的程式碼
      • 網站A需要site-a.core OSGi套件Jar
      • site-a.ui.apps部署網站A所需的程式碼
      • site-a.ui.config部署網站A所需的OSGi設定
      • site-a.ui.content部署網站A所需的內容和設定
      • 網站B需要site-b.core OSGi套件Jar
      • site-b.ui.apps部署網站B所需的程式碼
      • site-b.ui.config部署網站B所需的OSGi設定
      • site-b.ui.content部署網站B所需的內容和設定
  • ui.config封裝包含所有OSGi設定

    • 視為程式碼且屬於OSGi套件組合,但不包含一般內容節點。 因此會標示為容器封裝

    • 包含執行模式特定OSGi設定定義的組織資料夾

      • /apps/my-app/osgiconfig
    • 通用OSGi設定資料夾,其中包含套用至所有目標AEM as a Cloud Service部署目標的預設OSGi設定

      • /apps/my-app/osgiconfig/config
    • 執行模式特定的OSGi設定資料夾,其中包含套用至所有目標AEM as a Cloud Service部署目標的預設OSGi設定

      • /apps/my-app/osgiconfig/config.<author|publish>.<dev|stage|prod>
    • Repo Init OSGi設定指令碼

      • Repo Init是部署(可變)內容的建議方式,這些內容在邏輯上屬於AEM應用程式的一部分。 Repo Init OSGi設定應放置在如上所述的適當config.<runmode>資料夾中,並用於定義:

        • 基準內容結構
        • 使用者
        • 服務使用者
        • 群組
        • ACL (許可權)

額外的應用程式套件 extra-application-packages

如果AEM部署使用其他AEM專案(本身由自己的程式碼和內容套件組成),則其容器套件應內嵌在專案的all套件中。

例如,包含兩個廠商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應用程式所需的一切(程式碼和內容)

封裝型別 package-types

套件將標示其宣告的套件型別。 套件型別有助於釐清套件的用途和部署。

  • 容器套件必須將其packageType設定為container。 容器套件不得包含一般節點。 僅允許OSGi套件組合、設定和子套件。 AEM as a Cloud Service中的容器不允許使用安裝鉤點
  • 程式碼(不可變)套件必須將其packageType設定為application
  • 內容(可變)套件必須將其packageType設定為content

如需詳細資訊,請參閱以下的Apache Jackrabbit FileVault - Package Maven外掛程式檔案Apache Jackrabbit封裝型別FileVault Maven設定程式碼片段

TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

透過AdobeCloud Manager將套件標籤為部署 marking-packages-for-deployment-by-adoube-cloud-manager

根據預設,AdobeCloud Manager會收集由Maven組建版本產生的所有套件。 但是,因為容器(all)封裝是包含所有程式碼和內容封裝的單一部署成品,所以您必須確保僅​ 部署 ​容器(all)封裝。 為確保此,Maven構建版本生成的其他軟體包必須用的FileVault Content Package Maven插件配置進行標籤 <properties><cloudManagerTarget>none</cloudManageTarget></properties>

TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

存放庫初始 repo-init

Repo Init提供定義JCR結構的指示或指令碼,範圍從一般節點結構(如資料夾樹狀結構)到使用者、服務使用者、群組和ACL定義。

Repo Init的主要優點是,他們擁有隱含許可權,可執行其指令碼定義的所有動作。 此外,這類指令碼會在部署生命週期的初期叫用,確保所有必要的JCR結構會在程式碼執行時存在。

雖然Repo Init指令碼本身在ui.config專案中是以指令碼的形式存在,但是它們可以而且應該用來定義下列可變結構:

  • 基準內容結構
  • 服務使用者
  • 使用者
  • 群組
  • ACL

Repo Init指令碼會儲存為RepositoryInitializer OSGi Factory設定的scripts個專案。 因此,它們可以透過執行模式隱含定位,以便在AEM Author和AEM Publish Services的Repo Init指令碼之間或甚至在環境(開發、階段和生產環境)之間提供差異。

Repo Init OSGi設定最好以.config OSGi設定格式撰寫,因為它們支援多行,這是使用.cfg.json定義OSGi設定之最佳做法的例外情況。

定義「使用者」和「群組」時,只有群組會被視為應用程式的一部分,並且是其功能的組成部分。 您仍可在AEM執行階段定義「組織使用者」和「群組」。 例如,如果自訂工作流程將工作指派給已命名的群組,請在AEM應用程式中透過Repo Init定義該群組。 不過,如果群組只是組織性的,例如「Wendy的團隊」和「Sean的團隊」,這些群組最好在AEM執行階段中定義和管理。

TIP
Repo Init指令碼​ 必須 ​在內嵌scripts欄位中定義,否則references設定無法運作。

Apache Sling Repo Init檔案提供Repo Init指令碼的完整辭彙。

TIP
如需完整的程式碼片段,請參閱下方的Repo初始程式碼片段區段。

存放庫結構套件 repository-structure-package

程式碼套件需要設定FileVault Maven外掛程式的設定,以參照強制結構相依性正確性的<repositoryStructurePackage> (以確保一個程式碼套件不會安裝在另一個程式碼套件上)。 您可以為您的專案建立您自己的存放庫結構套件。

只需要 ​才能使用程式碼封裝,這表示任何標示為<packageType>application</packageType>的封裝。

若要瞭解如何建立應用程式的存放庫結構封裝,請參閱開發存放庫結構封裝

內容封裝(<packageType>content</packageType>) ​需要此存放庫結構封裝。

TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

將子套件內嵌於容器套件 embeddeds

內容或程式碼套件會放置在特殊的「side-car」資料夾中,並可使用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。 通常,所有子封裝都內嵌在單一的第二層資料夾底下,但可以建立任意數量的第二層資料夾以最好地代表應用程式的邏輯結構:

    • /apps/my-app-packages
    • /apps/my-other-app-packages
    • /apps/vendor-packages
    note warning
    WARNING
    根據慣例,子封裝內嵌資料夾的名稱為尾碼為-packages。 此命名可確保部署程式碼和內容封裝​ 不是 ​部署任何子封裝/apps/<app-name>/...的目標資料夾,這會導致破壞性和循環安裝行為。
  • 第3層資料夾必須是
    applicationcontentcontainer

    • application資料夾包含程式碼封裝
    • content資料夾包含內容封裝
    • container資料夾包含AEM應用程式可能包含的任何額外應用程式套件
      此資料夾名稱對應到它包含的封裝型別
  • 第4層資料夾包含子封裝,且必須是下列其中一項:

    • install以便您同時在​ AEM author和AEM publish上安裝
    • install.author,因此您只在AEM作者上安裝​ 2}
    • install.publish,因此您只在AEM發佈上安裝​ 2}
      只有install.authorinstall.publish支援的目標。
      ​不支援其 ​** 他執行模** 式。

例如,包含AEM作者和發佈特定套件的部署看起來可能像這樣:

  • all容器封裝內嵌下列封裝,以建立單一部署成品

    • 內嵌在/apps/my-app-packages/application/install中的ui.apps將程式碼部署到AEM作者和AEM發佈
    • 內嵌在/apps/my-app-packages/application/install.author中的ui.apps.author將程式碼僅部署給AEM作者
    • 內嵌於/apps/my-app-packages/content/install中的ui.content會將內容和設定部署至AEM作者和AEM發佈
    • 內嵌在/apps/my-app-packages/content/install.publish中的ui.content.publish只會將內容和設定部署到AEM發佈
TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

容器封裝的篩選器定義 container-package-filter-definition

由於程式碼和內容子套件內嵌在容器套件中,因此內嵌的目標路徑必須新增到容器專案的filter.xml。 這樣做可確保內巢狀件在建置時包含在容器套件中。

只要為包含要部署的子封裝的任何第二級資料夾新增<filter root="/apps/<my-app>-packages"/>專案。

TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

內嵌第三方套件 embedding-3rd-party-packages

所有套件都必須可透過Adobe的公用Maven成品存放庫或可存取的公用、可參照的第三方Maven成品存放庫使用。

如果協力廠商套件位於​ Adobe的公用Maven成品存放庫,則AdobeCloud Manager無需進一步設定即可解析成品。

如果協力廠商套件位於​ 公用協力廠商Maven成品存放庫,則必須在專案的pom.xml中註冊此存放庫,並將其嵌入到上面概述的方法之後

應該使用協力廠商應用程式/聯結器的all封裝作為專案容器(all)封裝中的容器來內嵌協力廠商應用程式/聯結器。

新增Maven相依性會遵循標準Maven實務,而嵌入協力廠商成品(程式碼和內容套件)則是上述概述的

TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

來自ui.content個套件的ui.apps之間的套件相依性 package-dependencies

為確保正確安裝套件,建議建立套件間相依性。

一般規則是包含可變內容的套件(ui.content)應依存於支援呈現和使用可變內容的不可變程式碼(ui.apps)。

此一般規則的重大例外是如果不可變程式碼套件(ui.apps或任何其他),only ​包含OSGi套裝。 若是如此,任何AEM套件都不應宣告其上的相依性。 原因是因為​ ​包含OSGi套裝的不可變程式碼套件未向AEM 封裝管理員註冊。 因此,任何依賴它的AEM套件都有不滿意的相依性,且無法安裝。

TIP
如需完整的程式碼片段,請參閱下方的POM XML程式碼片段區段。

內容套件相依性的常見模式如下:

簡易部署套件相依性 simple-deployment-package-dependencies

簡單大小寫會將ui.content可變內容套件設定為相依於ui.apps不可變程式碼套件。

  • all沒有相依性

    • ui.apps沒有相依性
    • ui.content依存於ui.apps

複雜的部署套件相依性 complex-deploxment-package-dependencies

複雜的部署會依簡單案例展開,並設定相對應可變內容與不可變程式碼套件之間的相依性。 如有需要,也可在不可變程式碼套件之間建立相依性。

  • 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

本機開發和部署 local-development-and-deployment

本文中概述的專案結構和組織是​ 完全相容的 ​本機開發AEM執行個體。

POM XML代碼片段 pom-xml-snippets

以下是Maven pom.xml設定片段,可新增到Maven專案中以符合上述建議。

封裝型別 xml-package-types

程式碼和內容封裝(部署為子封裝)必須宣告​ 應用程式 ​或​ 內容 ​的封裝型別(視其包含的內容而定)。

容器封裝型別 container-package-types

容器all/pom.xml專案​ ​宣告<packageType>

程式碼(不可變)封裝型別 immutable-package-types

程式碼套件必須將其packageType設定為application

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

內容(可變)封裝型別 mutable-package-types

內容套件必須將其packageType設定為content

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

將套件標籤為AdobeCloud Manager部署 cloud-manager-target

在每個產生套件的專 案中 ,除容器(all)專案外,將外掛程式聲明的 <cloudManagerTarget>none</cloudManagerTarget> 組態新增至外掛程式宣告的組態,以確 <properties> filevault-package-maven-plugin 保Adobe 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>
    ...

存放庫初始 snippet-repo-init

包含存放庫初始指令碼的Repo Init指令碼是透過scripts屬性在RepositoryInitializer OSGi工廠設定中定義。 因為這些指令碼是在OSGi設定中定義,所以它們可以透過執行模式使用常見的../config.<runmode>資料夾語意輕鬆設定範圍。

因為指令碼通常是多行宣告,在.config檔案中定義指令碼會比JSON型.cfg.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
"]

scripts OSGi屬性包含由Apache Sling的Repo Init語言定義的指示。

存放庫結構套件 xml-repository-structure-package

ui.apps/pom.xml與宣告程式碼套件(<packageType>application</packageType>)的任何其他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>
    ...

將子套件內嵌於容器套件 xml-embeddeds

all/pom.xml中,將下列<embeddeds>指令新增至filevault-package-maven-plugin外掛程式宣告。 請記住,不要 ​使用<subPackages>設定。 原因是因為它包含/etc/packages中的子封裝,而非/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>
...

容器封裝的篩選器定義 xml-container-package-filters

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存放庫 xml-3rd-party-maven-repositories

WARNING
新增更多Maven存放庫可能會延長Maven建置時間,因為會檢查其他Maven存放庫是否相依性。

在Reactor專案的pom.xml中,新增任何必要的第三方公用Maven存放庫指示。 第三方存放庫提供者應該可以使用完整的<repository>設定。

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

來自ui.content個套件的ui.apps之間的套件相依性 xml-package-dependencies

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

正在清除容器專案的目標資料夾 xml-clean-container-package

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>

其他資源 additional-resources

recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab