Integrieren von Diensten mit der JMX-Konsole integrating-services-with-the-jmx-console

Erstellen und stellen Sie MBeans für die Verwaltung von Diensten mithilfe der JMX-Konsole bereit. Zeigen Sie Dienstattribute und Vorgänge an, damit Verwaltungsaufgaben ausgeführt werden können.

Informationen zur Verwendung der JMX-Konsole finden Sie unter Überwachen von Serverressourcen mit der JMX-Konsole.

Das JMX-Framework in Felix und CQ5 the-jmx-framework-in-felix-and-cq

Auf der Apache Felix-Plattform stellen Sie MBeans als OSGi-Dienste bereit. Wenn ein MBean-Dienst in der OSGi-Dienst-Registrierung registriert wird, registriert das Aries JMX Whiteboard-Modul das MBean automatisch beim MBean-Server. Das MBean ist dann für die JMX-Konsole verfügbar, die die öffentlichen Attribute und Vorgänge veröffentlicht.

jmxwhiteboard

Erstellen von MBeans für CQ5 und CRX creating-mbeans-for-cq-and-crx

MBeans, die Sie für die Verwaltung von CQ5- oder CRX-Ressourcen erstellen, basieren auf der Schnittstelle javax.management.DynamicMBean. Um sie zu erstellen, folgen Sie den üblichen Designmustern, wie in der JMX-Spezifikation beschrieben:

  • Erstellen Sie die Verwaltungsoberfläche, einschließlich der Methoden zum Abrufen, Festlegen und Definieren von Attributen und anderer Methoden zum Definieren von Vorgängen.
  • Erstellen Sie die Implementierungsklasse. Die Klasse muss DynamicMBean implementieren oder eine Implementierungsklasse von DynamicMBean erweitern.
  • Befolgen Sie die standardmäßige Namenskonvention, sodass der Name der Implementierungsklasse der Name der Schnittstelle mit dem MBean-Suffix ist.

Neben der Definition der Verwaltungsschnittstelle definiert die Schnittstelle auch die OSGi-Dienstschnittstelle. Die Implementierungsklasse implementiert den OSGi-Dienst.

Verwenden von Anmerkungen zur Bereitstellung von MBean-Informationen using-annotations-to-provide-mbean-information

Die com.adobe.granite.jmx.annotation Das -Paket enthält mehrere Anmerkungen und Klassen, um der JMX-Konsole einfach MBean-Metadaten bereitzustellen. Verwenden Sie diese Anmerkungen und Klassen, anstatt Informationen direkt zum MBeanInfo-Objekt des MBean hinzuzufügen.

Anmerkungen

Fügen Sie Anmerkungen zur Verwaltungsoberfläche hinzu, um MBean-Metadaten anzugeben. Die Informationen werden in der JMX-Konsole für jede bereitgestellte Implementierungsklasse angezeigt. Die folgenden Anmerkungen sind verfügbar (vollständige Informationen finden Sie unter com.adobe.granite.jmx.annotation JavaDocs):

  • Beschreibung: Enthält eine Beschreibung der MBean-Klasse oder -Methode. Bei Verwendung in der Klassendeklaration wird die Beschreibung auf der JMX Console-Seite für das MBean angezeigt. Bei Verwendung in einer Methode wird die Beschreibung als Mauszeiger-Text für das entsprechende Attribut oder den entsprechenden Vorgang angezeigt.

  • Impact: Die Auswirkung einer Methode. Gültige Parameterwerte sind die Felder, die von javax.management.MBeanOperationInfo definiert werden.

  • Name: Gibt den für einen Vorgangsparameter anzuzeigenden Namen an. Verwenden Sie diese Anmerkung, um den tatsächlichen Namen des Methodenparameters zu überschreiben, der in der Benutzeroberfläche verwendet wird.

  • OpenTypeInfo: Gibt die Klasse an, die für die Darstellung von zusammengesetzten Daten oder Tabellendaten in der JMX-Konsole verwendet werden soll. Für die Verwendung mit Open MBeans

  • TabularTypeInfo: Wird verwendet, um die Klasse zu kommentieren, die zur Darstellung von Tabellendaten verwendet wird.

Klassen

Klassen werden zum Erstellen dynamischer MBeans bereitgestellt, die die Anmerkungen nutzen, die Sie zu ihren Schnittstellen hinzufügen:

  • AnnotatedStandardMBean: Eine Unterklasse der Klasse javax.management.StandardMBean , die der JMX-Konsole automatisch die Anmerkungsmetadaten bereitstellt.
  • OpenAnnotatedStandardMBean: eine Unterklasse der Klasse AnnotatedStandardMBean für die Erstellung von Open MBeans, die die OpenTypeInfo-Anmerkung nutzen.

Entwickeln von MBeans developing-mbeans

In der Regel spiegelt Ihr MBean den OSGi-Dienst wider, den Sie verwalten möchten. Auf der Felix-Plattform erstellen Sie das MBean wie auf anderen Java-Serverplattformen. Ein Hauptunterschied besteht darin, dass Sie Anmerkungen verwenden können, um MBean-Informationen anzugeben:

  • Verwaltungsschnittstelle: Definiert Attribute mithilfe von Getter-, Setter- und is-Methoden. Definiert Vorgänge mit anderen öffentlichen Methoden. Stellt mithilfe von Anmerkungen Metadaten für das BeanInfo-Objekt bereit.
  • MBean-Klasse: Implementiert die Verwaltungsschnittstelle. Erweitert die Klasse AnnotatedStandardMBean , sodass sie die Anmerkungen auf der Benutzeroberfläche verarbeitet.

Das folgende Beispiel-MBean stellt Informationen zum CRX-Repository bereit. Die Schnittstelle verwendet die Anmerkung Beschreibung , um Informationen für die JMX-Konsole bereitzustellen.

Verwaltungsoberfläche management-interface

package com.adobe.example.myapp;

import com.adobe.granite.jmx.annotation.Description;

@Description("Example MBean that exposes repository properties.")
public interface ExampleMBean {

    @Description("The name of the repository.")
    String getRepositoryName();

    @Description("The vendor of the repository.")
    String   getRepositoryVendor();

    @Description("The URL of repository vendor.")
    String getVendorUrl();
}

Die Implementierungsklasse verwendet den SlingRepository-Dienst zum Abrufen von Informationen zum CRX-Repository.

MBean-Implementierungsklasse mbean-implementation-class

package com.adobe.example.myapp;

import org.apache.felix.scr.annotations.*;
import org.apache.sling.jcr.api.SlingRepository;

import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean;

import javax.management.*;

public class ExampleMBeanImpl extends AnnotatedStandardMBean implements ExampleMBean {

    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
    private SlingRepository repository;

    public ExampleMBeanImpl() throws NotCompliantMBeanException {
        super(ExampleMBean.class);
    }

    public String getRepositoryName() {
        return repository.getDescriptor("jcr.repository.name");
    }

    public String getRepositoryVendor() {
        return repository.getDescriptor("jcr.repository.vendor");
    }

    public String getVendorUrl() {
        return repository.getDescriptor("jcr.repository.vendor.url");
    }
}

Die folgende Abbildung zeigt die Seite für dieses MBean in der JMX-Konsole.

jmxdescription

Registrieren von MBeans registering-mbeans

Wenn Sie MBeans als OSGi-Dienst registrieren, werden sie automatisch beim MBean-Server registriert. Um ein MBean auf CQ5 zu installieren, schließen Sie es in ein Bundle ein und exportieren Sie den MBean-Dienst wie jeden anderen OSGi-Dienst.

Zusätzlich zu den OSGi-bezogenen Metadaten müssen Sie auch Metadaten angeben, die das Aries JMX Whiteboard-Modul für die Registrierung des MBean beim MBean-Server benötigt:

  • Name der DynamicMBean-Schnittstelle: Deklarieren Sie, dass der MBean-Dienst die Schnittstelle javax.management.DynamicMBean implementiert. Diese Deklaration informiert das Aries JMX Whiteboard-Modul darüber, dass es sich bei dem Dienst um einen MBean-Dienst handelt.

  • MBean-Domain und wichtige Eigenschaften: Bei Felix geben Sie diese Daten als Eigenschaft des OSGi-Dienstes des MBean an. Dabei handelt es sich um dieselben Daten, die Sie für gewöhnlich dem MBean-Server in einem javax.management.ObjectName-Objekt bereitstellen.

Wenn Ihr MBean ein Spiegelbild eines einzelnen Dienstes ist, ist nur eine einzige Instanz des MBean-Dienstes erforderlich. Wenn Sie in diesem Fall das Felix SCR Maven-Plug-in verwenden, können Sie die Apache Felix Service Component Runtime (SCR)-Anmerkungen auf der MBean-Implementierungsklasse verwenden, um die JMX-bezogenen Metadaten anzugeben. Um mehrere MBean-Instanzen zu instanziieren, können Sie eine andere Klasse erstellen, die diese Registrierung des OSGi-Dienstes des MBean durchführt. In diesem Fall werden die JMX-bezogenen Metadaten zur Laufzeit generiert.

Einzelnes MBean

MBeans, für die Sie alle Attribute und Vorgänge zur Entwurfszeit definieren können, können mit SCR-Anmerkungen in der MBean-Implementierungsklasse bereitgestellt werden. Im folgenden Beispiel deklariert das Attribut value der Anmerkung Service, dass der Dienst die Schnittstelle DynamicMBean implementiert. Das Attribut name der Anmerkung Property legt die JMX-Domain und die wichtigsten Eigenschaften fest.

MBean-Implementierungsklasse mit SCR-Anmerkungen mbean-implementation-class-with-scr-annotations

package com.adobe.example.myapp;

import org.apache.felix.scr.annotations.*;
import org.apache.sling.jcr.api.SlingRepository;

import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean;

import javax.management.*;

@Component(immediate = true)
@Property(name = "jmx.objectname", value="com.adobe.example:type=CRX")
@Service(value = DynamicMBean.class)
public class ExampleMBeanImpl extends AnnotatedStandardMBean implements ExampleMBean {

    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
    private SlingRepository repository;

    public ExampleMBeanImpl() throws NotCompliantMBeanException {
        super(ExampleMBean.class);
    }

    public String getRepositoryName() {
        return repository.getDescriptor("jcr.repository.name");
    }

    public String getRepositoryVendor() {
        return repository.getDescriptor("jcr.repository.vendor");
    }

    public String getVendorUrl() {
        return repository.getDescriptor("jcr.repository.vendor.url");
    }
}

Mehrere MBean-Dienstinstanzen

Um mehrere Instanzen eines verwalteten Dienstes zu verwalten, erstellen Sie mehrere Instanzen des entsprechenden MBean-Dienstes. Darüber hinaus sollten MBean-Dienstinstanzen erstellt oder entfernt werden, wenn verwaltete Dienste gestartet oder angehalten werden. Sie können eine MBean-Managerklasse erstellen, die MBean-Dienste zur Laufzeit initiiert und den Dienstlebenszyklus verwaltet.

Verwenden Sie BundleContext, um das MBean als OSGi-Dienst zu registrieren. Schließen Sie die JMX-bezogenen Informationen in das Dictionary -Objekt ein, das Sie als Argument der BundleContext.registerService -Methode verwenden.

Im folgenden Codebeispiel wird der ExampleMBean-Dienst programmgesteuert registriert. Das componentContext -Objekt ist ComponentContext, das Zugriff auf BundleContext bietet.

Code-Snippet: programmatische MBean-Dienstregistrierung code-snippet-programmatic-mbean-service-registration

Dictionary mbeanProps = new Hashtable();
mbeanProps.put("jmx.objectname", "com.adobe.example:type=CRX");
ExampleMBeanImpl mbean = new ExampleMBeanImpl();
ServiceRegistration serviceregistration =
            componentContext.getBundleContext().registerService(DynamicMBean.class.getName(), mbean, mbeanProps);

Das Beispiel-MBean im nächsten Abschnitt enthält weitere Details.

Ein MBean-Service Manager ist nützlich, wenn Dienstkonfigurationen im Repository gespeichert werden. Der Manager kann Dienstinformationen abrufen und zum Konfigurieren und Erstellen des entsprechenden MBean verwenden. Die Manager-Klasse kann auch auf Repository-Änderungsereignisse warten und die MBean-Dienste entsprechend aktualisieren.

Beispiel: Überwachen von Workflow-Modellen mit JMX example-monitoring-workflow-models-using-jmx

Das MBean in diesem Beispiel enthält Informationen zu den CQ5-Workflow-Modellen, die im Repository gespeichert sind. Eine MBean-Manager-Klasse erstellt MBeans basierend auf Workflow-Modellen, die im Repository gespeichert sind, und registriert ihren OSGi-Dienst zur Laufzeit. Dieses Beispiel besteht aus einem einzelnen Bundle, das die folgenden Mitglieder enthält:

  • WorkflowMBean: Die Verwaltungsoberfläche.
  • WorkflowMBeanImpl: Die MBean-Implementierungsklasse.
  • WorkflowMBeanManager: Die Schnittstelle der MBean-Manager-Klasse.
  • WorkflowMBeanManagerImpl: Die Implementierungsklasse des MBean-Managers.

Hinweis: Um das Beispiel zu vereinfachen, führt der Beispiel-Code keine Protokollierungsaufgaben durch und reagiert nicht auf gemeldete Ausnahmen.

WorkflowMBeanManagerImpl enthält eine Komponentenaktivierungsmethode. Wenn die Komponente aktiviert ist, führt die Methode die folgenden Aufgaben aus:

  • Ruft einen BundleContext für das Bundle ab.
  • Fragt das Repository ab, um die Pfade der vorhandenen Workflow-Modelle abzurufen.
  • Sie erstellt MBeans für jedes Workflow-Modell.
  • Registriert die MBeans bei der OSGi-Dienstregistrierung.

Die MBean-Metadaten werden in der JMX-Konsole mit der Domain com.adobe.example und dem workflow_model-Typ angezeigt. Als Eigenschaft ist der Pfad des Workflow-Modellkonfigurationsknotens angegeben.

jmxworkflowmbean

Das Beispiel-MBean the-example-mbean

Dieses Beispiel setzt eine MBean-Schnittstelle und -Implementierung voraus, die ein Abbild der Schnittstelle com.day.cq.workflow.model.WorkflowModel ist. Das MBean ist sehr einfach, sodass sich das Beispiel auf die Konfigurations- und Bereitstellungsaspekte des Designs konzentrieren kann. Das MBean stellt ein einzelnes Attribut bereit, den Modellnamen.

WorkflowMBean-Schnittstelle workflowmbean-interface

package com.adobe.example.myapp.api;

import com.adobe.granite.jmx.annotation.Description;

@Description("Example MBean that exposes Workflow model properties.")
public interface WorkflowMBean {

 @Description("The name of the Workflow model.")
 String getModelName();
}

WorkflowMBeanImpl workflowmbeanimpl

package com.adobe.example.myapp.impl;

import javax.management.NotCompliantMBeanException;

import com.day.cq.workflow.model.WorkflowModel;
import com.adobe.example.myapp.api.WorkflowMBean;
import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean;

public class WorkflowMBeanImpl extends AnnotatedStandardMBean implements WorkflowMBean {

 WorkflowModel model;

 protected WorkflowMBeanImpl(WorkflowModel inmodel)
   throws NotCompliantMBeanException {
  super(WorkflowMBean.class);
  model=inmodel;
 }

 public String getModelName() {
  return model.getTitle();
 }
}

Der Beispiel-MBean-Manager the-example-mbean-manager

Der WorkflowMBeanManager-Dienst enthält die Komponentenaktivierungsmethode, mit der WorkflowMBean-Dienste erstellt werden. Die Dienstimplementierung umfasst die folgenden Methoden:

  • activate: Der Komponenten-Aktivator. Erstellt die JCR-Sitzung zum Lesen der WorkflowModel-Konfigurationsknoten. Der Stammknoten, unter dem Modellkonfigurationen gespeichert werden, wird in einem statischen Feld definiert. Der Name des Konfigurationsknotens wird auch in einem statischen Feld definiert. Diese Methode ruft andere Methoden auf, die die Knotenmodellpfade abrufen und die WorkflowMBeans des Modells erstellen.
  • getModelIds: Durchsucht das Repository unter dem Stammknoten und ruft den Pfad jedes Modellknotens ab.
  • makeMBean: Verwendet den Modellpfad, um ein WorkflowModel -Objekt zu erstellen, erstellt ein WorkflowMBean dafür und registriert seinen OSGi-Dienst.
NOTE
Die WorkflowMBeanManager-Implementierung erstellt nur MBean-Dienste für Modellkonfigurationen, die bei Aktivierung der Komponente vorhanden sind. Eine stabilere Implementierung überwacht Repository-Ereignisse in Bezug auf neue Modellkonfigurationen und Änderungen oder Löschungen vorhandener Modellkonfigurationen. Wenn eine Änderung eintritt, kann der Manager den entsprechenden WorkflowMBean-Dienst erstellen, ändern oder entfernen.

WorkflowMBeanManager-Schnittstelle workflowmbeanmanager-interface

package com.adobe.example.myapp.api;

public interface WorkflowMBeanManager {

}

WorkflowMBeanManagerImpl workflowmbeanmanagerimpl

package com.adobe.example.myapp.impl;

import java.util.*;

import org.apache.felix.scr.annotations.*;

import javax.jcr.Session;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.management.ObjectName;

import org.apache.sling.jcr.api.SlingRepository;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.WorkflowSession;
import com.adobe.example.myapp.api.WorkflowMBean;
import com.adobe.example.myapp.api.WorkflowMBeanManager;

/**Instantiates and registers WorkflowMBean services */
@Component(immediate=true)
@Service(value=WorkflowMBeanManager.class)
public class WorkflowMBeanManagerImpl implements WorkflowMBeanManager {
 //The ComponentContext provides access to the BundleContext
 private ComponentContext componentContext;

 //Use the SlingRepository service to read model nodes
 @Reference
        private SlingRepository repository = null;

 //Use the WorkflowService service to create WorkflowModel objects
 @Reference
 private WorkflowService workflowservice = null;

  private Session session;

         //Details about model nodes
  private static final String MODEL_ROOT ="/etc/workflow/models";
  private static final String MODEL_NODE = "model";

  private Set<String> modelIds = new HashSet<String>();

        //Storage for ServiceRegistrations for MBean services
  private Collection<ServiceRegistration> mbeanRegistrations= new Vector<ServiceRegistration>(0,1);

 @Activate
        protected void activate(ComponentContext ctx) {
             //Traverse the repository and load the model nodes
             try {
                   session = repository.loginAdministrative(null);
                   // load and store model node paths
                   if (session.nodeExists(MODEL_ROOT)) {
                          getModelIds(session.getNode(MODEL_ROOT));
                   }
                   //Create MBeans for each model
                   for(String modid: modelIds){
                    makeMBean(modid);
                    }
             }catch(Exception e){ }
          }

        /**
         * Add JMX domain and key properties to a collection
         * Instantiate a WorkflowModel and its WorkflowMBeanImpl object
         * Register the MBean OSGi service
         */
 private void makeMBean(String modelId) {
             // create MBean for the model
             try {
                 Dictionary<String, String> mbeanProps = new Hashtable<String, String>();
                 //These properties appear on the JMX Console home page
                 mbeanProps.put("jmx.objectname", "com.adobe.example:type=workflow_model,id=" + ObjectName.quote(modelId));
                 WorkflowSession wfsession = workflowservice.getWorkflowSession(session);
                 WorkflowMBeanImpl mbean = new WorkflowMBeanImpl(wfsession.getModel(modelId));

                ServiceRegistration serviceregistration = componentContext.getBundleContext().registerService(WorkflowMBean.class.getName(), mbean, mbeanProps);
                //Store the ServiceRegistration objects for deactivation
                mbeanRegistrations.add(serviceregistration);
             } catch (Throwable t) {}
         }

        /**
         * Traverses the repository branch below a given Node. Stores the path of each model node.
         */
 private void getModelIds(Node node) throws RepositoryException {
  try{
                     NodeIterator iter = node.getNodes();
                     while (iter.hasNext()) {
                           Node n = iter.nextNode();
                           //Look for "jcr:content" nodes
                           if (n.getName().equals("jcr:content")) {
                                //get the path of the model node and save it
                                if(n.hasNode(MODEL_NODE)){
                                      modelIds.add(n.getNode(MODEL_NODE).getPath());
                                 }
                           } else{
                                   //Scan child nodes
                                   getModelIds(n);
                           }
                       }
  }catch(Exception e){ }
       }

        /**
         * Log out of the JCR session and unregister WorkflowMBean services
         */
        @Deactivate
        protected void deactivate() {
          session.logout();
          session=null;
          for(ServiceRegistration sr:mbeanRegistrations){
         sr.unregister();
          }
        }
}

Die POM-Datei für das Beispiel-MBean the-pom-file-for-the-example-mbean

Der Einfachheit halber können Sie den folgenden XML-Code in Ihre Projektdatei pom.xml kopieren, um das Komponenten-Bundle zu erstellen. Das POM verweist auf mehrere erforderliche Plug-ins und Abhängigkeiten.

Plug-ins:

  • Apache Maven Compiler Plugin: Kompiliert Java-Klassen aus dem Quellcode.
  • Apache Felix Maven Bundle Plugin: Erstellt das Bundle und das Manifest
  • Apache Felix Maven SCR Plugin: Erstellt die Komponentendeskriptordatei und konfiguriert die Manifestkopfzeile der Dienstkomponente.

Hinweis: Zum Zeitpunkt des Schreibens ist das Maven-SCR-Plugin nicht mit dem m2e-Plugin für Eclipse kompatibel. (Siehe Felix bug 3170. Um die Eclipse IDE zu verwenden, installieren Sie Maven und verwenden Sie die Befehlszeilenschnittstelle, um Builds auszuführen.

Beispiel-POM-Datei example-pom-file

<project xmlns="https://maven.apache.org/POM/4.0.0"
  xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.adobe.example.myapp</groupId>
  <artifactId>workflow-mbean</artifactId>
  <version>0.0.2-SNAPSHOT</version>
  <name>mbean-simple</name>
  <url>www.adobe.com</url>
  <description>A simple MBean</description>
  <packaging>bundle</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
                <version>1.7.2</version>
                <executions>
                    <execution>
                        <id>generate-scr-scrdescriptor</id>
              <goals>
                 <goal>scr</goal>
              </goals>
            </execution>
         </executions>
            </plugin>
             <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>1.4.3</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Export-Package>com.adobe.example.myapp.*;version=${project.version}</Export-Package>
                </instructions>
            </configuration>
        </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr.annotations</artifactId>
            <version>1.6.0</version>
            <scope>provided</scope>
        </dependency>
         <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.api</artifactId>
            <version>2.0.8</version>
            <scope>provided</scope>
        </dependency>
         <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr</artifactId>
            <version>1.6.1-R1236132</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.jcr.api</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>com.adobe.granite</groupId>
            <artifactId>com.adobe.granite.jmx</artifactId>
            <version>0.1.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
       <groupId>com.day.cq.wcm</groupId>
       <artifactId>cq-wcm-mobile-api</artifactId>
       <version>5.5.2</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
       <groupId>com.day.cq.workflow</groupId>
       <artifactId>cq-workflow-api</artifactId>
       <version>5.5.0</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
       <groupId>javax.jcr</groupId>
       <artifactId>jcr</artifactId>
       <version>2.0</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
                <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.6.4</version>
  <scope>provided</scope>
 </dependency>
    </dependencies>
</project>

Fügen Sie Ihrer Maven-Einstellungsdatei das folgende Profil hinzu, um das öffentliche Adobe-Repository zu verwenden.

Maven-Profil maven-profile

<profile>
    <id>adobe-public</id>
    <activation>
         <activeByDefault>false</activeByDefault>
    </activation>
    <properties>
         <releaseRepository-Id>adobe-public-releases</releaseRepository-Id>
         <releaseRepository-Name>Adobe Public Releases</releaseRepository-Name>
         <releaseRepository-URL>https://repo1.maven.org/maven2/com/adobe/</releaseRepository-URL>
    </properties>
    <repositories>
         <repository>
             <id>adobe-public-releases</id>
             <name>Adobe  Public Repository</name>
             <url>https://repo1.maven.org/maven2/com/adobe/</url>
             <releases>
                 <enabled>true</enabled>
                 <updatePolicy>never</updatePolicy>
             </releases>
             <snapshots>
                 <enabled>false</enabled>
             </snapshots>
         </repository>
     </repositories>
     <pluginRepositories>
         <pluginRepository>
             <id>adobe-public-releases</id>
             <name>Adobe Public Repository</name>
             <url>https://repo1.maven.org/maven2/com/adobe/</url>
             <releases>
                 <enabled>true</enabled>
                 <updatePolicy>never</updatePolicy>
             </releases>
             <snapshots>
                 <enabled>false</enabled>
             </snapshots>
         </pluginRepository>
     </pluginRepositories>
</profile>
recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2