サードパーティアーティファクトのインストール - 公開 Maven リポジトリでは入手できないもの

AEM プロジェクトを構築およびデプロイする際に、公開 Maven リポジトリでは入手できない ​サードパーティアーティファクトをインストールする方法について説明します。

サードパーティアーティファクト ​に該当するのは、以下のようなものです。

  • OSGi バンドル:OSGi バンドルは、Java クラス、リソースおよびバンドルとその依存関係を記述するマニフェストを含む Java™ アーカイブファイルです。
  • Java jar:Java クラスとリソースを含む Java™ アーカイブファイル。
  • パッケージ:パッケージは、ファイルシステムのシリアル化形式でリポジトリコンテンツを含む zip ファイルです。

標準シナリオ

通常は、AEM プロジェクトの pom.xml ファイルの依存関係として、公開 Maven リポジトリで​ 入手可能 ​なサードパーティのバンドルパッケージをインストールします。

例:

  • AEM WCM コアコンポーネントバンドル ​は、WKND プロジェクトの pom.xml ファイルに依存関係として追加されます。ここでは、AEM WCM コアコンポーネントバンドルが AEM ランタイムによって提供されるので、provided 範囲が使用されます。バンドルが AEM ランタイムによって提供されない場合は、compile 範囲を使用します。これがデフォルトの範囲になります。

  • WKND 共有パッケージ ​は、WKND プロジェクトの pom.xml ファイルに依存関係として追加されます。

まれなシナリオ

場合によっては、AEM プロジェクトを構築およびデプロイする際に、Maven Central リポジトリまたはアドビの公開リポジトリで​ 入手できない ​サードパーティのバンドル、jar、パッケージをインストールする必要が生じることがあります。

理由は、以下が考えられます。

  • バンドルまたはパッケージは内部チームまたはサードパーティベンダーによって提供され、公開 Maven リポジトリでは入手できない

  • Java™ jar ファイルは OSGi バンドルではない ​ので、公開 Maven リポジトリで使用できる場合とできない場合がある。

  • 公開 Maven リポジトリで入手可能なサードパーティパッケージの最新バージョンでまだリリースされていない機能が必要。ローカルで構築されたリリースバージョンまたはスナップショットバージョンをインストールすることにした。

前提条件

このチュートリアルに従うには、以下が必要です。

設定

  • 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 リポジトリでは入手できない ​デモ OSGi my-example-bundle を AEM WKND プロジェクトにインストールおよび使用しましょう。

my-example-bundleHelloWorldService 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 ディレクトリのみを作成する必要があります。

  • 抽出した target ディレクトリから my-example-bundle-1.0-SNAPSHOT.jar ファイルを上記の all/src/main/content/jcr_root/apps/wknd-vendor-packages/container/install ディレクトリにコピーします。

    all モジュールのサードパーティバンドル

バンドルからのサービスの使用

AEM WKND プロジェクトの my-example-bundle から HelloWorldService OSGi サービスを使用しましょう。

  • AEM WKND プロジェクトの core モジュールで、core/src/main/java/com/adobe/aem/guides/wknd/core/servletSayHello.java Sling サーブレットを作成します。

    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 サーブレットが期待どおりに動作することを確認します。

  • 上記の変更を AEM WKND プロジェクトのリポジトリにコミットします。次に、Cloud Manager パイプラインを実行して、RDE または AEM 環境の変更を確認します。

    SayHello サーブレット - バンドルサービスの検証

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 ファイルを更新して、system 範囲と systemPath がバンドルファイルを指す依存関係として OSGi バンドルを追加します。この手順は、プロジェクトをコンパイルするために必要です。

AEM プロジェクトへのサードパーティ jar のインストール

この例では、my-example-jar は OSGi バンドルではなく、Java jar ファイルです。

公開 Maven リポジトリでは入手できない ​デモ用の my-example-jar を AEM WKND プロジェクトにインストールおよび使用してみましょう。

my-example-jar は、Hello World! メッセージを返す sayHello() メソッドを持つ MyHelloWorldService クラスを含む Java jar ファイルです。

詳しくは、my-example-jar.zip ファイル内の README.md ファイルを参照してください。

all モジュールへの jar の追加

最初の手順では、my-example-jar を AEM WKND プロジェクトの all モジュールに追加します。

  • my-example-jar.zip ファイルをダウンロードして抽出します。

  • AEM WKND プロジェクトの all モジュールで、all/resource/jar ディレクトリ構造を作成します。

  • 抽出した target ディレクトリから my-example-jar-1.0-SNAPSHOT.jar ファイルを上記の all/resource/jar ディレクトリにコピーします。

    all モジュールのサードパーティ jar

jar からのサービスの使用

AEM WKND プロジェクトの my-example-jar から MyHelloWorldService を使用しましょう。

  • AEM WKND プロジェクトの core モジュールで、core/src/main/java/com/adobe/aem/guides/wknd/core/servletSayHello.java Sling サーブレットを作成します。

    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 ファイルで、次の 2 つの変更を行います。

    • my-example-jar を依存関係として追加します。

      code language-xml
      ...
      <!-- My Example JAR -->
      <dependency>
          <groupId>com.my.example</groupId>
          <artifactId>my-example-jar</artifactId>
      </dependency>
      ...
      
    • bnd-maven-plugin 設定を更新して、構築中の OSGi バンドル(aem-guides-wknd.core)に my-example-jar を含めます。

      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 サーブレットが期待どおりに動作することを確認します。

  • 上記の変更を AEM WKND プロジェクトのリポジトリにコミットします。次に、Cloud Manager パイプラインを実行して、RDE または AEM 環境の変更を確認します。

    SayHello サーブレット - 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 設定を更新して、構築中の OSGi バンドルにインラインリソースとして Java jar を含めます。

次の手順は、Java jar が公開 Maven リポジトリで使用できない場合にのみ必要です。

  • Java jar を all モジュールの resource/jar ディレクトリにコピーします。

  • ルートおよびコアモジュールの pom.xml ファイルを更新して、system 範囲と systemPath が jar ファイルを指す依存関係として Java jar を追加します。

AEM プロジェクトへのサードパーティパッケージのインストール

メイン分岐からローカルに構築された ACS AEM Commons スナップショット ​バージョンをインストールしましょう。

これは、公開 Maven リポジトリでは使用できない AEM パッケージをインストールする手順を示す目的でのみ行います。

ACS AEM Commons パッケージは、公開 Maven リポジトリで入手できます。AEM プロジェクトに追加する方法について詳しくは、AEM Maven プロジェクトへの ACS AEM Commons の追加を参照してください。

all モジュールへのパッケージの追加

最初の手順では、パッケージを AEM WKND プロジェクトの all モジュールに追加します。

  • POM ファイルから ACS AEM Commons リリース依存関係をコメント化または削除します。依存関係を特定する方法について詳しくは、AEM Maven プロジェクトへの ACS AEM Commons の追加を参照してください。

  • ACS AEM Commons リポジトリmaster 分岐をローカルマシンにクローン作成します。

  • 次のコマンドを使用して、ACS AEM Commons スナップショットバージョンを構築します。

    code language-none
    $mvn clean install
    
  • ローカルに構築されたパッケージは all/target にあり、2 つの .zip ファイルがあります。-cloud で終了するファイルは AEM as a Cloud Service 用で、もう 1 つは 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 スナップショットバージョンパッケージ

    • OSGi コンソール(http://localhost:4502/system/console/bundles

      ACS AEM Commons スナップショットバージョンバンドル

  • 上記の変更を 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