安裝協力廠商成品 — 無法在公共Maven存放庫中取得

瞭解如何在建置和部署AEM專案時安裝公開Maven存放庫​ 中不可用的 ​協力廠商成品。

協力廠商成品 ​可以是:

  • OSGi套件: OSGi套件是Java™封存檔案,其中包含Java類別、資源,以及說明套件及其相依性的資訊清單。
  • Java jar:包含Java類別和資源的Java™封存檔案。
  • 封裝:封裝是包含檔案系統序列化表單之儲存庫內容的zip檔案。

標準案例

通常您要安裝協力廠商套件組合,的套件可在公用Maven存放庫中 ​作為您AEM專案pom.xml檔案中的相依性。

例如:

  • AEM WCM核心元件 套件 ​已新增為WKND專案的 pom.xml檔案中的相依性。 此處將provided範圍用作AEM執行階段所提供的AEM WCM核心元件組合。 如果AEM執行階段未提供該組合,您將會使用compile範圍,而且它是預設範圍。

  • 共用的WKND 套件 ​已新增為WKND專案的 pom.xml檔案中的相依性。

罕見情況

有時在建置和部署AEM專案時,您可能需要安裝協力廠商套件組合或jar,或在Maven中央存放庫Adobe公用存放庫中無法使用的套件​

原因可能是:

  • 套件組合或封裝是由內部團隊或第三方廠商所提供,且​ 在公用Maven存放庫 ​中無法使用。

  • Java™ jar檔案​ 不是OSGi套件,並且在公用Maven存放庫中可能會提供也可能不提供。

  • 您需要的功能尚未在公共Maven存放庫中最新版本的協力廠商套件中發行。 您決定安裝本機建置的RELEASE或SNAPSHOT版本。

先決條件

若要按照本教學課程進行學習,您需要:

設定

  • 設定AEM 6.X或AEM as a Cloud Service (AEMCS)本機開發環境或RDE環境。

  • 複製並部署AEM WKND專案。

    code language-none
    $ git clone git@github.com:adobe/aem-guides-wknd.git
    $ cd aem-guides-wknd
    $ mvn clean install -PautoInstallPackage
    

    驗證WKND網站頁面是否正確轉譯。

在AEM專案中安裝第三方套件組合 install-third-party-bundle

讓我們安裝並使用公開Maven存放庫​ 中沒有提供給AEM WKND專案的示範OSGi my-example-bundle

my-example-bundle ​匯出HelloWorldService個OSGi服務,其sayHello()方法傳回Hello Earth!則訊息。

如需詳細資訊,請參閱my-example-bundle.zip檔案中的README.md檔案。

將套件組合新增至all模組

第一個步驟是將my-example-bundle新增到AEM WKND專案的all模組。

  • 下載並解壓縮my-example-bundle.zip檔案。

  • 在AEM WKND專案的all模組中,建立all/src/main/content/jcr_root/apps/wknd-vendor-packages/container/install目錄結構。 /all/src/main/content目錄已存在,您只需要建立jcr_root/apps/wknd-vendor-packages/container/install目錄。

  • my-example-bundle-1.0-SNAPSHOT.jar檔案從擷取的target目錄複製到上述all/src/main/content/jcr_root/apps/wknd-vendor-packages/container/install目錄。

    所有模組 中的第三方套件

使用套件組合中的服務

讓我們使用AEM WKND專案中my-example-bundleHelloWorldService OSGi服務。

  • 在AEM WKND專案的core模組中,建立SayHello.java Sling servlet @ core/src/main/java/com/adobe/aem/guides/wknd/core/servlet

    code language-java
    package com.adobe.aem.guides.wknd.core.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletException;
    
    import org.apache.sling.api.SlingHttpServletRequest;
    import org.apache.sling.api.SlingHttpServletResponse;
    import org.apache.sling.api.servlets.HttpConstants;
    import org.apache.sling.api.servlets.ServletResolverConstants;
    import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
    import org.osgi.service.component.annotations.Component;
    import org.osgi.service.component.annotations.Reference;
    import com.example.services.HelloWorldService;
    
    @Component(service = Servlet.class, property = {
        ServletResolverConstants.SLING_SERVLET_PATHS + "=/bin/sayhello",
        ServletResolverConstants.SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET
    })
    public class SayHello extends SlingSafeMethodsServlet {
    
            private static final long serialVersionUID = 1L;
    
            // Injecting the HelloWorldService from the `my-example-bundle` bundle
            @Reference
            private HelloWorldService helloWorldService;
    
            @Override
            protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
                // Invoking the HelloWorldService's `sayHello` method
                response.getWriter().write("My-Example-Bundle service says: " + helloWorldService.sayHello());
            }
    }
    
  • 在AEM WKND專案的根pom.xml檔案中,將my-example-bundle新增為相依性。

    code language-xml
    ...
    <!-- My Example Bundle -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>my-example-bundle</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>system</scope>
        <systemPath>${maven.multiModuleProjectDirectory}/all/src/main/content/jcr_root/apps/wknd-vendor-packages/container/install/my-example-bundle-1.0-SNAPSHOT.jar</systemPath>
    </dependency>
    ...
    

    此處:

    • system範圍表示不應在公用Maven存放庫中查閱相依性。
    • systemPath是AEM WKND專案的all模組中的my-example-bundle檔案路徑。
    • ${maven.multiModuleProjectDirectory}是指向多模組專案根目錄的Maven屬性。
  • 在AEM WKND專案的core模組的core/pom.xml檔案中,將my-example-bundle新增為相依性。

    code language-xml
    ...
    <!-- My Example Bundle -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>my-example-bundle</artifactId>
    </dependency>
    ...
    
  • 使用以下命令建置和部署AEM WKND專案:

    code language-none
    $ mvn clean install -PautoInstallPackage
    
  • 存取瀏覽器中的URL http://localhost:4502/bin/sayhello,以驗證SayHello Servlet是否如預期般運作。

  • 將上述變更提交至AEM WKND專案的存放庫。 然後執行Cloud Manager管道以驗證RDE或AEM環境中的變更。

    驗證SayHello servlet — 組合服務

AEM WKND專案的tutorial/install-3rd-party-bundle分支有上述變更供您參考。

重要學習 key-learnings-bundle

公共Maven存放庫中未提供的OSGi套件組合可按照以下步驟安裝在AEM專案中:

  • 將OSGi套件組合複製到all模組的jcr_root/apps/<PROJECT-NAME>-vendor-packages/container/install目錄。 若要封裝並部署套件組合至AEM執行個體,此步驟是必要的。

  • 更新根與核心模組的pom.xml檔案,將OSGi套件組合新增為相依性,且範圍和systemPath指向套件組合檔案。 system此步驟是編譯專案的必要步驟。

在AEM專案中安裝協力廠商jar

在此範例中,my-example-jar不是OSGi套件組合,而是Java jar檔案。

讓我們安裝並使用示範my-example-jar,此示範​ 在公用Maven存放庫 ​中不適用於AEM WKND專案。

my-example-jar ​是Java jar檔案,其中包含具有sayHello()方法的MyHelloWorldService類別,可傳回Hello World!訊息。

如需詳細資訊,請參閱my-example-jar.zip檔案中的README.md檔案。

將jar新增到all模組

第一個步驟是將my-example-jar新增到AEM WKND專案的all模組。

  • 下載並解壓縮my-example-jar.zip檔案。

  • 在AEM WKND專案的all模組中,建立all/resource/jar目錄結構。

  • my-example-jar-1.0-SNAPSHOT.jar檔案從擷取的target目錄複製到上述all/resource/jar目錄。

    所有模組 中的第三方jar

使用jar中的服務

讓我們使用AEM WKND專案中my-example-jarMyHelloWorldService

  • 在AEM WKND專案的core模組中,建立SayHello.java Sling servlet @ core/src/main/java/com/adobe/aem/guides/wknd/core/servlet

    code language-java
    package com.adobe.aem.guides.wknd.core.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletException;
    
    import org.apache.sling.api.SlingHttpServletRequest;
    import org.apache.sling.api.SlingHttpServletResponse;
    import org.apache.sling.api.servlets.HttpConstants;
    import org.apache.sling.api.servlets.ServletResolverConstants;
    import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
    import org.osgi.service.component.annotations.Component;
    
    import com.my.example.MyHelloWorldService;
    
    @Component(service = Servlet.class, property = {
            ServletResolverConstants.SLING_SERVLET_PATHS + "=/bin/sayhello",
            ServletResolverConstants.SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET
    })
    public class SayHello extends SlingSafeMethodsServlet {
    
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
                throws ServletException, IOException {
    
            // Creating an instance of MyHelloWorldService
            MyHelloWorldService myHelloWorldService = new MyHelloWorldService();
    
            // Invoking the MyHelloWorldService's `sayHello` method
            response.getWriter().write("My-Example-JAR service says: " + myHelloWorldService.sayHello());
        }
    }
    
  • 在AEM WKND專案的根pom.xml檔案中,將my-example-jar新增為相依性。

    code language-xml
    ...
    <!-- My Example JAR -->
    <dependency>
        <groupId>com.my.example</groupId>
        <artifactId>my-example-jar</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>system</scope>
        <systemPath>${maven.multiModuleProjectDirectory}/all/resource/jar/my-example-jar-1.0-SNAPSHOT.jar</systemPath>
    </dependency>
    ...
    

    此處:

    • system範圍表示不應在公用Maven存放庫中查閱相依性。
    • systemPath是AEM WKND專案的all模組中的my-example-jar檔案路徑。
    • ${maven.multiModuleProjectDirectory}是指向多模組專案根目錄的Maven屬性。
  • 在AEM WKND專案的core模組的core/pom.xml檔案中,進行兩項變更:

    • my-example-jar新增為相依性。

      code language-xml
      ...
      <!-- My Example JAR -->
      <dependency>
          <groupId>com.my.example</groupId>
          <artifactId>my-example-jar</artifactId>
      </dependency>
      ...
      
    • 更新bnd-maven-plugin設定以將my-example-jar包含在正在建置的OSGi套件組合(aem-guides-wknd.core)中。

      code language-xml
      ...
      <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-maven-plugin</artifactId>
          <executions>
              <execution>
                  <id>bnd-process</id>
                  <goals>
                      <goal>bnd-process</goal>
                  </goals>
                  <configuration>
                      <bnd><![CDATA[
                  Import-Package: javax.annotation;version=0.0.0,*
                  <!-- Include the 3rd party jar as inline resource-->
                  -includeresource: \
                  lib/my-example-jar.jar=my-example-jar-1.0-SNAPSHOT.jar;lib:=true
                          ]]></bnd>
                  </configuration>
              </execution>
          </executions>
      </plugin>
      ...
      
  • 使用以下命令建置和部署AEM WKND專案:

    code language-none
    $ mvn clean install -PautoInstallPackage
    
  • 存取瀏覽器中的URL http://localhost:4502/bin/sayhello,以驗證SayHello Servlet是否如預期般運作。

  • 將上述變更提交至AEM WKND專案的存放庫。 然後執行Cloud Manager管道以驗證RDE或AEM環境中的變更。

    驗證SayHello servlet - JAR服務

AEM WKND專案的tutorial/install-3rd-party-jar分支有上述變更可供您參考。

如果Java jar檔案​ 可在公用Maven存放庫中取得但並非OSGi套件,您可以遵循上述步驟,但<dependency>system範圍和systemPath元素不是必要專案除外。

重要學習 key-learnings-jar

非OSGi套件組合且可能在公用Maven存放庫中提供的Java Jar,可以按照以下步驟安裝在AEM專案中:

  • 更新核心模組pom.xml檔案中的bnd-maven-plugin設定,將Java jar加入為正在建置的OSGi套件組合中的內嵌資源。

只有在公共Maven存放庫中沒有Java jar時,才需要執行以下步驟:

  • 將Java jar複製到all模組的resource/jar目錄。

  • 更新根與核心模組的pom.xml檔案,以將Java jar新增為相依性,具有system範圍和systemPath指向jar檔案。

在AEM專案中安裝協力廠商套件

讓我們安裝從主要分支本機建置的ACS AEM Commons SNAPSHOT ​版本。

它完全只是為了示範安裝公共Maven存放庫中沒有的AEM套件的步驟。

ACS AEM Commons套件可在公共Maven存放庫中取得。 請參考將ACS AEM Commons新增至您的AEM Maven專案,將其新增至您的AEM專案。

將套件新增至all模組

第一步是將套件新增到AEM WKND專案的all模組。

  • 從POM檔案註解或移除ACS AEM Commons版本相依性。 請參閱將ACS AEM Commons新增至您的AEM Maven專案以識別相依性。

  • ACS AEM Commons存放庫master分支複製到您的本機電腦。

  • 使用以下命令建置ACS AEM Commons SNAPSHOT版本:

    code language-none
    $mvn clean install
    
  • 本機建置的封裝位於@ all/target,有兩個.zip檔案,其中一個結尾是-cloud,適用於AEM as a Cloud Service,另一個適用於AEM 6.X。

  • 在AEM WKND專案的all模組中,建立all/src/main/content/jcr_root/apps/wknd-vendor-packages/container/install目錄結構。 /all/src/main/content目錄已存在,您只需要建立jcr_root/apps/wknd-vendor-packages/container/install目錄。

  • 將本機建置的套件(.zip)檔案複製到/all/src/main/content/jcr_root/apps/mysite-vendor-packages/container/install目錄。

  • 使用以下命令建置和部署AEM WKND專案:

    code language-none
    $ mvn clean install -PautoInstallPackage
    
  • 驗證已安裝的ACS AEM Commons套件:

    • CRX封裝管理員@ http://localhost:4502/crx/packmgr/index.jsp

      ACS AEM Commons SNAPSHOT版本套件

    • OSGi主控台@ http://localhost:4502/system/console/bundles

      ACS AEM Commons SNAPSHOT版本套件

  • 將上述變更提交至AEM WKND專案的存放庫。 然後執行Cloud Manager管道以驗證RDE或AEM環境中的變更。

重要學習 key-learnings-package

公共Maven存放庫中沒有的AEM套件可以按照以下步驟安裝在AEM專案中:

  • 將封裝複製到all模組的jcr_root/apps/<PROJECT-NAME>-vendor-packages/container/install目錄。 若要封裝套件並將其部署到AEM執行個體,此步驟是必要的。

摘要

在本教學課程中,您已瞭解如何在建置和部署AEM專案時,安裝公開Maven存放庫中不可用的協力廠商成品(套件、Java jar和套件)。

recommendation-more-help
c92bdb17-1e49-4e76-bcdd-89e4f85f45e6