安裝協力廠商成品 — 無法在公共Maven存放庫中取得
瞭解如何在建置和部署AEM專案時安裝公開Maven存放庫 中不可用的 協力廠商成品。
協力廠商成品 可以是:
標準案例
通常您要安裝協力廠商套件組合,的套件可在公用Maven存放庫中 作為您AEM專案pom.xml
檔案中的相依性。
例如:
-
AEM WCM核心元件 套件 已新增為WKND專案的
pom.xml
檔案中的相依性。 此處將provided
範圍用作AEM執行階段所提供的AEM WCM核心元件組合。 如果AEM執行階段未提供該組合,您將會使用compile
範圍,而且它是預設範圍。
罕見情況
有時在建置和部署AEM專案時,您可能需要安裝協力廠商套件組合或jar,或在Maven中央存放庫或Adobe公用存放庫中無法使用的套件 。
原因可能是:
-
套件組合或封裝是由內部團隊或第三方廠商所提供,且 在公用Maven存放庫 中無法使用。
-
Java™ jar檔案 不是OSGi套件,並且在公用Maven存放庫中可能會提供也可能不提供。
-
您需要的功能尚未在公共Maven存放庫中最新版本的協力廠商套件中發行。 您決定安裝本機建置的RELEASE或SNAPSHOT版本。
先決條件
若要按照本教學課程進行學習,您需要:
-
AEM WKND專案 新增協力廠商套件組合或jar或封裝 並驗證變更。
設定
-
設定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-bundle
的HelloWorldService
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環境中的變更。
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-jar
的MyHelloWorldService
。
-
在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環境中的變更。
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
-
OSGi主控台@
http://localhost:4502/system/console/bundles
-
-
將上述變更提交至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和套件)。