You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:15:43 UTC

[sling-maven-launchpad-plugin] 06/34: SLING-2105 - initial implementation of partial bundle lists

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag maven-launchpad-plugin-2.1.0
in repository https://gitbox.apache.org/repos/asf/sling-maven-launchpad-plugin.git

commit b751260154168693024adcdebcfa251ff9deaf9c
Author: Justin Edelson <ju...@apache.org>
AuthorDate: Fri Jun 17 16:41:07 2011 +0000

    SLING-2105 - initial implementation of partial bundle lists
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/maven/maven-launchpad-plugin@1136928 13f79535-47bb-0310-9956-ffa450edef68
---
 .../projectsupport/AbstractBundleListMojo.java     | 313 +--------------------
 .../AbstractLaunchpadFrameworkMojo.java            |   2 +-
 .../AbstractLaunchpadStartingMojo.java             |   2 +-
 ...tMojo.java => AbstractUsingBundleListMojo.java} |  38 +--
 .../maven/projectsupport/AttachBundleListMojo.java |   2 +-
 ...tMojo.java => AttachPartialBundleListMojo.java} |  23 +-
 .../CheckBundleListForSnapshotsMojo.java           |   2 +-
 .../CreateKarafFeatureDescriptorMojo.java          |   2 +-
 .../maven/projectsupport/OutputBundleListMojo.java |   2 +-
 src/main/resources/META-INF/plexus/components.xml  |  53 ++++
 10 files changed, 86 insertions(+), 353 deletions(-)

diff --git a/src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java
index cd6bb11..1818ff6 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java
@@ -17,40 +17,10 @@
 package org.apache.sling.maven.projectsupport;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.List;
-import java.util.Properties;
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
-import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList;
-import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.io.xpp3.BundleListXpp3Reader;
-import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.drools.KnowledgeBase;
-import org.drools.KnowledgeBaseFactory;
-import org.drools.builder.KnowledgeBuilder;
-import org.drools.builder.KnowledgeBuilderError;
-import org.drools.builder.KnowledgeBuilderFactory;
-import org.drools.builder.ResourceType;
-import org.drools.io.ResourceFactory;
-import org.drools.runtime.StatefulKnowledgeSession;
 
 public abstract class AbstractBundleListMojo extends AbstractMojo {
 
@@ -70,6 +40,11 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
      */
     protected static final String WAR = "war";
 
+    /**
+     * Partial Bundle List type
+     */
+    protected static final String PARTIAL = "partialbundlelist";
+
     protected static final String CONFIG_PATH_PREFIX = "resources/config";
 
     protected static final String BUNDLE_PATH_PREFIX = "resources/bundles";
@@ -88,13 +63,6 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
     protected File bundleListFile;
 
     /**
-     * The definition of the defaultBundleList artifact.
-     *
-     * @parameter
-     */
-    protected ArtifactDefinition defaultBundleList;
-
-    /**
      * The Maven project.
      *
      * @parameter expression="${project}"
@@ -108,275 +76,4 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
      */
     protected MavenProjectHelper projectHelper;
 
-    /**
-     * Any additional bundles to include in the project's bundles directory.
-     *
-     * @parameter
-     */
-    private ArtifactDefinition[] additionalBundles;
-
-    private BundleList bundleList;
-
-    /**
-     * Bundles which should be removed from the project's bundles directory.
-     *
-     * @parameter
-     */
-    private ArtifactDefinition[] bundleExclusions;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     *
-     * @component
-     */
-    private ArtifactFactory factory;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     *
-     * @component hint="maven"
-     */
-    private ArtifactMetadataSource metadataSource;
-
-    /**
-     * If true, include the default bundles.
-     *
-     * @parameter default-value="true"
-     */
-    private boolean includeDefaultBundles;
-
-    /**
-     * Location of the local repository.
-     *
-     * @parameter expression="${localRepository}"
-     * @readonly
-     * @required
-     */
-    private ArtifactRepository local;
-
-    /**
-     * List of Remote Repositories used by the resolver.
-     *
-     * @parameter expression="${project.remoteArtifactRepositories}"
-     * @readonly
-     * @required
-     */
-    private List remoteRepos;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     *
-     * @component
-     */
-    private ArtifactResolver resolver;
-
-    /**
-     * @parameter
-     */
-    private File[] rewriteRuleFiles;
-
-    /**
-     * @parameter expression="${session}
-     * @required
-     * @readonly
-     */
-    protected MavenSession mavenSession;
-
-    public final void execute() throws MojoFailureException, MojoExecutionException {
-        try {
-            initBundleList();
-        } catch (MojoExecutionException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new MojoExecutionException("Unable to load dependency information from properties file.", e);
-        }
-        executeWithArtifacts();
-
-    }
-
-    /**
-     * Execute the logic of the plugin after the default artifacts have been
-     * initialized.
-     */
-    protected abstract void executeWithArtifacts() throws MojoExecutionException, MojoFailureException;
-
-    /**
-     * Get a resolved Artifact from the coordinates found in the artifact
-     * definition.
-     *
-     * @param def the artifact definition
-     * @return the artifact, which has been resolved
-     * @throws MojoExecutionException
-     */
-    protected Artifact getArtifact(ArtifactDefinition def) throws MojoExecutionException {
-        return getArtifact(def.getGroupId(), def.getArtifactId(), def.getVersion(), def.getType(), def.getClassifier());
-    }
-
-    /**
-     * Get a resolved Artifact from the coordinates provided
-     *
-     * @return the artifact, which has been resolved.
-     * @throws MojoExecutionException
-     */
-    protected Artifact getArtifact(String groupId, String artifactId, String version, String type, String classifier)
-            throws MojoExecutionException {
-        Artifact artifact;
-        VersionRange vr;
-
-        try {
-            vr = VersionRange.createFromVersionSpec(version);
-        } catch (InvalidVersionSpecificationException e) {
-            vr = VersionRange.createFromVersion(version);
-        }
-
-        if (StringUtils.isEmpty(classifier)) {
-            artifact = factory.createDependencyArtifact(groupId, artifactId, vr, type, null, Artifact.SCOPE_COMPILE);
-        } else {
-            artifact = factory.createDependencyArtifact(groupId, artifactId, vr, type, classifier,
-                    Artifact.SCOPE_COMPILE);
-        }
-
-        // This code kicks in when the version specifier is a range.
-        if (vr.getRecommendedVersion() == null) {
-            try {
-                List availVersions = metadataSource.retrieveAvailableVersions(artifact, local, remoteRepos);
-                ArtifactVersion resolvedVersion = vr.matchVersion(availVersions);
-                artifact.setVersion(resolvedVersion.toString());
-            } catch (ArtifactMetadataRetrievalException e) {
-                throw new MojoExecutionException("Unable to find version for artifact", e);
-            }
-            
-        }
-
-        try {
-            resolver.resolve(artifact, remoteRepos, local);
-        } catch (ArtifactResolutionException e) {
-            throw new MojoExecutionException("Unable to resolve artifact.", e);
-        } catch (ArtifactNotFoundException e) {
-            throw new MojoExecutionException("Unable to find artifact.", e);
-        }
-        return artifact;
-    }
-
-    protected BundleList getBundleList() {
-        return bundleList;
-    }
-
-    /**
-     * Hook methods for subclasses to initialize any additional artifact
-     * definitions.
-     *
-     * @param dependencies the dependency properties loaded from the JAR file
-     */
-    protected void initArtifactDefinitions(Properties dependencies) {
-    }
-
-    /**
-     * Hook methods for subclasses to initialize the bundle list.
-     */
-    protected void initBundleList(BundleList bundleList) {
-    }
-
-    protected boolean isCurrentArtifact(ArtifactDefinition def) {
-        return (def.getGroupId().equals(project.getGroupId()) && def.getArtifactId().equals(project.getArtifactId()));
-    }
-
-    /**
-     * Initialize the artifact definitions using defaults inside the plugin JAR.
-     *
-     * @throws IOException if the default properties can't be read
-     * @throws XmlPullParserException
-     * @throws MojoExecutionException
-     */
-    private final void initArtifactDefinitions() throws IOException {
-        Properties dependencies = new Properties();
-        dependencies.load(getClass().getResourceAsStream(
-                "/org/apache/sling/maven/projectsupport/dependencies.properties"));
-
-        if (defaultBundleList == null) {
-            defaultBundleList = new ArtifactDefinition();
-        }
-        defaultBundleList.initDefaults(dependencies.getProperty("defaultBundleList"));
-
-        initArtifactDefinitions(dependencies);
-    }
-
-    private final void initBundleList() throws IOException, XmlPullParserException, MojoExecutionException {
-        initArtifactDefinitions();
-        if (isCurrentArtifact(defaultBundleList)) {
-            bundleList = readBundleList(bundleListFile);
-        } else {
-            bundleList = new BundleList();
-            if (includeDefaultBundles) {
-                Artifact defBndListArtifact = getArtifact(defaultBundleList.getGroupId(),
-                        defaultBundleList.getArtifactId(), defaultBundleList.getVersion(), defaultBundleList.getType(),
-                        defaultBundleList.getClassifier());
-                getLog().info("Using bundle list file from " + defBndListArtifact.getFile().getAbsolutePath());
-                bundleList = readBundleList(defBndListArtifact.getFile());
-            }
-
-            if (bundleListFile.exists()) {
-                bundleList.merge(readBundleList(bundleListFile));
-            }
-        }
-        if (additionalBundles != null) {
-            for (ArtifactDefinition def : additionalBundles) {
-                bundleList.add(def.toBundle());
-            }
-        }
-        if (bundleExclusions != null) {
-            for (ArtifactDefinition def : bundleExclusions) {
-                bundleList.remove(def.toBundle(), false);
-            }
-        }
-        initBundleList(bundleList);
-
-        rewriteBundleList(bundleList);
-    }
-
-    private void rewriteBundleList(BundleList bundleList) throws MojoExecutionException {
-        if (rewriteRuleFiles != null) {
-            KnowledgeBase knowledgeBase = createKnowledgeBase(rewriteRuleFiles);
-            StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
-            try {
-                session.setGlobal("mavenSession", mavenSession);
-                session.setGlobal("mavenProject", project);
-                session.insert(bundleList);
-                session.fireAllRules();
-            } finally {
-                session.dispose();
-            }
-        }
-    }
-
-    private KnowledgeBase createKnowledgeBase(File[] files) throws MojoExecutionException {
-        KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        builder.add(ResourceFactory.newClassPathResource("drools-globals.drl", getClass()), ResourceType.DRL);
-        for (File file : files) {
-            getLog().info("Parsing rule file " + file.getAbsolutePath());
-            builder.add(ResourceFactory.newFileResource(file), ResourceType.DRL);
-        }
-        if (builder.hasErrors()) {
-            getLog().error("Rule errors:");
-            for (KnowledgeBuilderError error : builder.getErrors()) {
-                getLog().error(error.toString());
-            }
-            throw new MojoExecutionException("Unable to create rules. See log for details.");
-        }
-
-        KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase();
-        base.addKnowledgePackages(builder.getKnowledgePackages());
-        return base;
-    }
-
-    private BundleList readBundleList(File file) throws IOException, XmlPullParserException {
-        BundleListXpp3Reader reader = new BundleListXpp3Reader();
-        FileInputStream fis = new FileInputStream(file);
-        try {
-            return reader.read(fis);
-        } finally {
-            fis.close();
-        }
-    }
-
 }
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadFrameworkMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadFrameworkMojo.java
index 7eeede7..4697899 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadFrameworkMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadFrameworkMojo.java
@@ -30,7 +30,7 @@ import org.codehaus.plexus.util.FileUtils;
  * This class contains the Launchpad-framework specific utility methods.
  *
  */
-public abstract class AbstractLaunchpadFrameworkMojo extends AbstractBundleListMojo {
+public abstract class AbstractLaunchpadFrameworkMojo extends AbstractUsingBundleListMojo {
 
     /**
      * The name of the directory within the output directory into which the base
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadStartingMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadStartingMojo.java
index 6c5c4fd..6835161 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadStartingMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/AbstractLaunchpadStartingMojo.java
@@ -50,7 +50,7 @@ import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList;
 import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.StartLevel;
 import org.osgi.framework.BundleException;
 
-public abstract class AbstractLaunchpadStartingMojo extends AbstractBundleListMojo implements Notifiable {
+public abstract class AbstractLaunchpadStartingMojo extends AbstractUsingBundleListMojo implements Notifiable {
 
     /** Default log level setting if no set on command line (value is "INFO"). */
     private static final int DEFAULT_LOG_LEVEL = Logger.LOG_INFO;
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/AbstractUsingBundleListMojo.java
similarity index 95%
copy from src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java
copy to src/main/java/org/apache/sling/maven/projectsupport/AbstractUsingBundleListMojo.java
index cd6bb11..5420b42 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/AbstractBundleListMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/AbstractUsingBundleListMojo.java
@@ -21,6 +21,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.List;
 import java.util.Properties;
+import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
@@ -34,11 +35,8 @@ import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
 import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList;
 import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.io.xpp3.BundleListXpp3Reader;
 import org.codehaus.plexus.util.StringUtils;
@@ -52,7 +50,7 @@ import org.drools.builder.ResourceType;
 import org.drools.io.ResourceFactory;
 import org.drools.runtime.StatefulKnowledgeSession;
 
-public abstract class AbstractBundleListMojo extends AbstractMojo {
+public abstract class AbstractUsingBundleListMojo extends AbstractBundleListMojo {
 
     /**
      * @parameter expression="${configDirectory}"
@@ -83,11 +81,6 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
     }
 
     /**
-     * @parameter default-value="${basedir}/src/main/bundles/list.xml"
-     */
-    protected File bundleListFile;
-
-    /**
      * The definition of the defaultBundleList artifact.
      *
      * @parameter
@@ -95,20 +88,6 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
     protected ArtifactDefinition defaultBundleList;
 
     /**
-     * The Maven project.
-     *
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    protected MavenProject project;
-
-    /**
-     * @component
-     */
-    protected MavenProjectHelper projectHelper;
-
-    /**
      * Any additional bundles to include in the project's bundles directory.
      *
      * @parameter
@@ -301,6 +280,7 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
         initArtifactDefinitions(dependencies);
     }
 
+    @SuppressWarnings("unchecked")
     private final void initBundleList() throws IOException, XmlPullParserException, MojoExecutionException {
         initArtifactDefinitions();
         if (isCurrentArtifact(defaultBundleList)) {
@@ -329,6 +309,18 @@ public abstract class AbstractBundleListMojo extends AbstractMojo {
                 bundleList.remove(def.toBundle(), false);
             }
         }
+        
+        Set<Artifact> dependencies = project.getDependencyArtifacts();
+        for (Artifact artifact : dependencies) {
+            if (PARTIAL.equals(artifact.getType())) {
+                getLog().info(
+                        String.format("merging partial bundle list for %s:%s:%s", artifact.getGroupId(),
+                                artifact.getArtifactId(), artifact.getVersion()));
+                bundleList.merge(readBundleList(artifact.getFile()));
+            }
+        }
+        
+        
         initBundleList(bundleList);
 
         rewriteBundleList(bundleList);
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/AttachBundleListMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/AttachBundleListMojo.java
index ddb0287..dc5505c 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/AttachBundleListMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/AttachBundleListMojo.java
@@ -31,7 +31,7 @@ import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.io.xpp3.BundleLis
  * @phase package
  * @description attach the bundle list as a project artifact
  */
-public class AttachBundleListMojo extends AbstractBundleListMojo {
+public class AttachBundleListMojo extends AbstractUsingBundleListMojo {
 
     private static final String CLASSIFIER = "bundlelist";
 
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/AttachPartialBundleListMojo.java
similarity index 58%
copy from src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java
copy to src/main/java/org/apache/sling/maven/projectsupport/AttachPartialBundleListMojo.java
index 031949f..79b1cc0 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/AttachPartialBundleListMojo.java
@@ -16,29 +16,20 @@
  */
 package org.apache.sling.maven.projectsupport;
 
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.io.xpp3.BundleListXpp3Writer;
 
 /**
- * Output the bundle list back to the console.
- * 
- * @goal output-bundle-list
+ * Attaches the bundle list as a project artifact.
  * 
+ * @goal attach-partial-bundle-list
+ * @phase package
+ * @description attach the partial bundle list as a project artifact
  */
-public class OutputBundleListMojo extends AbstractBundleListMojo {
+public class AttachPartialBundleListMojo extends AbstractBundleListMojo {
 
-    @Override
-    protected void executeWithArtifacts() throws MojoExecutionException, MojoFailureException {
-        BundleListXpp3Writer writer = new BundleListXpp3Writer();
-        try {
-            writer.write(new OutputStreamWriter(System.out), getBundleList());
-        } catch (IOException e) {
-            throw new MojoExecutionException("Unable to write bundle list", e);
-        }
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        project.getArtifact().setFile(bundleListFile);
     }
 
 }
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/CheckBundleListForSnapshotsMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/CheckBundleListForSnapshotsMojo.java
index cb0a210..9c6b97b 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/CheckBundleListForSnapshotsMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/CheckBundleListForSnapshotsMojo.java
@@ -32,7 +32,7 @@ import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.StartLevel;
  * @goal check-bundle-list-for-snapshots
  *
  */
-public class CheckBundleListForSnapshotsMojo extends AbstractBundleListMojo {
+public class CheckBundleListForSnapshotsMojo extends AbstractUsingBundleListMojo {
 
     /**
      * True if the build should be failed if a snapshot is found.
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/CreateKarafFeatureDescriptorMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/CreateKarafFeatureDescriptorMojo.java
index 9e7e9e3..dba8b69 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/CreateKarafFeatureDescriptorMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/CreateKarafFeatureDescriptorMojo.java
@@ -37,7 +37,7 @@ import org.jdom.output.XMLOutputter;
  * @phase package
  * @description create a karaf feature descriptor
  */
-public class CreateKarafFeatureDescriptorMojo extends AbstractBundleListMojo {
+public class CreateKarafFeatureDescriptorMojo extends AbstractUsingBundleListMojo {
 
     private static final String CLASSIFIER = "features";
 
diff --git a/src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java
index 031949f..9c8cec1 100644
--- a/src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java
+++ b/src/main/java/org/apache/sling/maven/projectsupport/OutputBundleListMojo.java
@@ -29,7 +29,7 @@ import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.io.xpp3.BundleLis
  * @goal output-bundle-list
  * 
  */
-public class OutputBundleListMojo extends AbstractBundleListMojo {
+public class OutputBundleListMojo extends AbstractUsingBundleListMojo {
 
     @Override
     protected void executeWithArtifacts() throws MojoExecutionException, MojoFailureException {
diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..d6fd19c
--- /dev/null
+++ b/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,53 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+      <role-hint>partialbundlelist</role-hint>
+      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+      <configuration>
+        <lifecycles>
+          <lifecycle>
+            <id>default</id>
+            <!-- START SNIPPET: bundle-lifecycle -->
+            <phases>
+              <package>org.apache.sling:maven-launchpad-plugin:attach-partial-bundle-list</package>
+              <install>org.apache.maven.plugins:maven-install-plugin:install</install>
+              <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
+            </phases>
+            <!-- END SNIPPET: bundle-lifecycle -->
+          </lifecycle>
+        </lifecycles>
+      </configuration>
+    </component>
+    <component>
+      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
+      <role-hint>partialbundlelist</role-hint>
+      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
+      <configuration>
+        <type>partialbundlelist</type>
+        <includesDependencies>false</includesDependencies>
+        <language>xml</language>
+        <extension>xml</extension>
+        <addedToClasspath>false</addedToClasspath>
+      </configuration>
+    </component>
+  </components>
+</component-set>

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.