You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2014/05/19 09:19:52 UTC

[1/4] [KARAF-2985] Provide a plugin to automatically generate generic requirements / dependencies for karaf internal activators

Repository: karaf
Updated Branches:
  refs/heads/master f9a03a363 -> f4ad8c4fa


http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java b/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
index 0948f0b..d55a7de 100644
--- a/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
+++ b/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
@@ -48,7 +48,7 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
     private long schedulerStopTimeout = TimeUnit.MILLISECONDS.convert(30, TimeUnit.SECONDS);
 
     private List<ServiceRegistration> registrations;
-    private Map<String, SingleServiceTracker> trackers = new HashMap<String, SingleServiceTracker>();
+    private Map<String, SingleServiceTracker> trackers = new HashMap<>();
     private ServiceRegistration managedServiceRegistration;
     private Dictionary<String, ?> configuration;
 
@@ -88,6 +88,16 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
     }
 
     protected void doOpen() throws Exception {
+        Services services = getClass().getAnnotation(Services.class);
+        if (services != null) {
+            for (RequireService require : services.requires()) {
+                trackService(require.value(), require.filter());
+            }
+        }
+        Managed managed = getClass().getAnnotation(Managed.class);
+        if (managed != null) {
+            manage(managed.value());
+        }
     }
 
     protected void doClose() {
@@ -115,7 +125,7 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
      * Called in {@link #doOpen()}
      */
     protected void manage(String pid) {
-        Hashtable<String, Object> props = new Hashtable<String, Object>();
+        Hashtable<String, Object> props = new Hashtable<>();
         props.put(Constants.SERVICE_PID, pid);
         managedServiceRegistration = bundleContext.registerService(
                 "org.osgi.service.cm.ManagedService", this, props);
@@ -220,9 +230,9 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
     /**
      * Called in {@link #doOpen()}
      */
-    protected void trackService(Class clazz) {
+    protected void trackService(Class<?> clazz) throws InvalidSyntaxException {
         if (!trackers.containsKey(clazz.getName())) {
-            SingleServiceTracker tracker = new SingleServiceTracker(bundleContext, clazz, this);
+            SingleServiceTracker tracker = new SingleServiceTracker<>(bundleContext, clazz, this);
             tracker.open();
             trackers.put(clazz.getName(), tracker);
         }
@@ -231,20 +241,12 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
     /**
      * Called in {@link #doOpen()}
      */
-    protected void trackService(String clazz) {
-        if (!trackers.containsKey(clazz)) {
-            SingleServiceTracker tracker = new SingleServiceTracker(bundleContext, clazz, this);
-            tracker.open();
-            trackers.put(clazz, tracker);
-        }
-    }
-
-    /**
-     * Called in {@link #doOpen()}
-     */
-    protected void trackService(Class clazz, String filter) throws InvalidSyntaxException {
+    protected void trackService(Class<?> clazz, String filter) throws InvalidSyntaxException {
         if (!trackers.containsKey(clazz.getName())) {
-            SingleServiceTracker tracker = new SingleServiceTracker(bundleContext, clazz, filter, this);
+            if (filter != null && filter.isEmpty()) {
+                filter = null;
+            }
+            SingleServiceTracker tracker = new SingleServiceTracker<>(bundleContext, clazz, filter, this);
             tracker.open();
             trackers.put(clazz.getName(), tracker);
         }
@@ -264,19 +266,8 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
     /**
      * Called in {@link #doStart()}
      */
-    protected Object getTrackedService(String clazz) {
-        SingleServiceTracker tracker = trackers.get(clazz);
-        if (tracker == null) {
-            throw new IllegalStateException("Service not tracked for class " + clazz);
-        }
-        return tracker.getService();
-    }
-
-    /**
-     * Called in {@link #doStart()}
-     */
     protected void registerMBean(Object mbean, String type) {
-        Hashtable<String, Object> props = new Hashtable<String, Object>();
+        Hashtable<String, Object> props = new Hashtable<>();
         props.put("jmx.objectname", "org.apache.karaf:" + type + ",name=" + System.getProperty("karaf.name"));
         trackRegistration(bundleContext.registerService(getInterfaceNames(mbean), mbean, props));
     }
@@ -284,54 +275,44 @@ public class BaseActivator implements BundleActivator, SingleServiceTracker.Sing
     /**
      * Called in {@link #doStart()}
      */
-    protected void register(Class clazz, Object service) {
-        register(clazz, service, null);
-    }
-
-    /**
-     * Called in {@link #doStart()}
-     */
-    protected void register(Class clazz, Object service, Dictionary<String, ?> props) {
-        trackRegistration(bundleContext.registerService(clazz, service, props));
-    }
-
-    /**
-     * Called in {@link #doStart()}
-     */
-    protected void register(String clazz, Object service) {
+    protected <T> void register(Class<T> clazz, T service) {
         register(clazz, service, null);
     }
 
     /**
      * Called in {@link #doStart()}
      */
-    protected void register(String clazz, Object service, Dictionary<String, ?> props) {
+    protected <T> void register(Class<T> clazz, T service, Dictionary<String, ?> props) {
         trackRegistration(bundleContext.registerService(clazz, service, props));
     }
 
     /**
      * Called in {@link #doStart()}
      */
-    protected void register(String[] clazz, Object service) {
+    protected void register(Class[] clazz, Object service) {
         register(clazz, service, null);
     }
 
     /**
      * Called in {@link #doStart()}
      */
-    protected void register(String[] clazz, Object service, Dictionary<String, ?> props) {
-        trackRegistration(bundleContext.registerService(clazz, service, props));
+    protected void register(Class[] clazz, Object service, Dictionary<String, ?> props) {
+        String[] names = new String[clazz.length];
+        for (int i = 0; i < clazz.length; i++) {
+            names[i] = clazz[i].getName();
+        }
+        trackRegistration(bundleContext.registerService(names, service, props));
     }
 
     private void trackRegistration(ServiceRegistration registration) {
         if (registrations == null) {
-            registrations = new ArrayList<ServiceRegistration>();
+            registrations = new ArrayList<>();
         }
         registrations.add(registration);
     }
 
     protected String[] getInterfaceNames(Object object) {
-        List<String> names = new ArrayList<String>();
+        List<String> names = new ArrayList<>();
         for (Class cl = object.getClass(); cl != Object.class; cl = cl.getSuperclass()) {
             addSuperInterfaces(names, cl);
         }

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/util/src/main/java/org/apache/karaf/util/tracker/Managed.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/tracker/Managed.java b/util/src/main/java/org/apache/karaf/util/tracker/Managed.java
new file mode 100644
index 0000000..4aec385
--- /dev/null
+++ b/util/src/main/java/org/apache/karaf/util/tracker/Managed.java
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.util.tracker;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface Managed {
+
+    String value();
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/util/src/main/java/org/apache/karaf/util/tracker/ProvideService.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/tracker/ProvideService.java b/util/src/main/java/org/apache/karaf/util/tracker/ProvideService.java
new file mode 100644
index 0000000..7913746
--- /dev/null
+++ b/util/src/main/java/org/apache/karaf/util/tracker/ProvideService.java
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.util.tracker;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ProvideService {
+
+    Class value();
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/util/src/main/java/org/apache/karaf/util/tracker/RequireService.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/tracker/RequireService.java b/util/src/main/java/org/apache/karaf/util/tracker/RequireService.java
new file mode 100644
index 0000000..da391e2
--- /dev/null
+++ b/util/src/main/java/org/apache/karaf/util/tracker/RequireService.java
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.util.tracker;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RequireService {
+
+    Class value();
+
+    String filter() default "";
+
+    boolean optional() default false;
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/util/src/main/java/org/apache/karaf/util/tracker/Services.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/tracker/Services.java b/util/src/main/java/org/apache/karaf/util/tracker/Services.java
new file mode 100644
index 0000000..7575138
--- /dev/null
+++ b/util/src/main/java/org/apache/karaf/util/tracker/Services.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.util.tracker;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface Services {
+
+    ProvideService[] provides() default {};
+
+    RequireService[] requires() default {};
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/util/src/main/java/org/apache/karaf/util/tracker/SingleServiceTracker.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/tracker/SingleServiceTracker.java b/util/src/main/java/org/apache/karaf/util/tracker/SingleServiceTracker.java
index eca364f..0e547e7 100644
--- a/util/src/main/java/org/apache/karaf/util/tracker/SingleServiceTracker.java
+++ b/util/src/main/java/org/apache/karaf/util/tracker/SingleServiceTracker.java
@@ -48,8 +48,8 @@ public final class SingleServiceTracker<T> {
     private final AtomicReference<ServiceReference> ref = new AtomicReference<ServiceReference>();
     private final AtomicBoolean open = new AtomicBoolean(false);
     private final SingleServiceListener serviceListener;
-    private String filterString;
-    private Filter filter;
+    private final String filterString;
+    private final Filter filter;
 
     private final ServiceListener listener = new ServiceListener() {
         public void serviceChanged(ServiceEvent event) {
@@ -66,22 +66,16 @@ public final class SingleServiceTracker<T> {
         }
     };
 
-    public SingleServiceTracker(BundleContext context, String className, SingleServiceListener sl) {
-        ctx = context;
-        this.className = className;
-        serviceListener = sl;
-    }
-
-    public SingleServiceTracker(BundleContext context, Class<T> clazz, SingleServiceListener sl) {
-        ctx = context;
-        this.className = clazz.getName();
-        serviceListener = sl;
+    public SingleServiceTracker(BundleContext context, Class<T> clazz, SingleServiceListener sl) throws InvalidSyntaxException {
+        this(context, clazz, null, sl);
     }
 
     public SingleServiceTracker(BundleContext context, Class<T> clazz, String filterString, SingleServiceListener sl) throws InvalidSyntaxException {
-        this(context, clazz, sl);
+        this.ctx = context;
+        this.className = clazz.getName();
+        this.serviceListener = sl;
         this.filterString = filterString;
-        if (filterString != null) filter = context.createFilter(filterString);
+        this.filter = (filterString != null) ? context.createFilter(filterString) : null;
     }
 
     public T getService() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/web/pom.xml
----------------------------------------------------------------------
diff --git a/web/pom.xml b/web/pom.xml
index 037ee5f..a2754f3 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -86,6 +86,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -101,6 +105,12 @@
                             org.apache.karaf.web.management.internal,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.web.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/web/src/main/java/org/apache/karaf/web/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/web/src/main/java/org/apache/karaf/web/internal/osgi/Activator.java b/web/src/main/java/org/apache/karaf/web/internal/osgi/Activator.java
index e5bcfe1..4709e81 100644
--- a/web/src/main/java/org/apache/karaf/web/internal/osgi/Activator.java
+++ b/web/src/main/java/org/apache/karaf/web/internal/osgi/Activator.java
@@ -17,6 +17,10 @@
 package org.apache.karaf.web.internal.osgi;
 
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.Managed;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.apache.karaf.web.WebContainerService;
 import org.apache.karaf.web.internal.WebContainerServiceImpl;
 import org.apache.karaf.web.internal.WebEventHandler;
@@ -24,14 +28,14 @@ import org.apache.karaf.web.management.internal.WebMBeanImpl;
 import org.ops4j.pax.web.service.spi.WarManager;
 import org.ops4j.pax.web.service.spi.WebListener;
 
+@Services(
+        requires = @RequireService(WarManager.class),
+        provides = @ProvideService(WebContainerService.class)
+)
+@Managed("org.apache.karaf.shell")
 public class Activator extends BaseActivator {
 
     @Override
-    protected void doOpen() throws Exception {
-        trackService(WarManager.class);
-    }
-
-    @Override
     protected void doStart() throws Exception {
         WarManager warManager = getTrackedService(WarManager.class);
         if (warManager == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/wrapper/pom.xml
----------------------------------------------------------------------
diff --git a/wrapper/pom.xml b/wrapper/pom.xml
index 6f36786..823621b 100644
--- a/wrapper/pom.xml
+++ b/wrapper/pom.xml
@@ -95,6 +95,10 @@
                 </configuration>
             </plugin>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -121,6 +125,12 @@
                         <Bundle-Activator>
                             org.apache.karaf.wrapper.internal.osgi.Activator
                         </Bundle-Activator>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Karaf-Commands>
                             org.apache.karaf.wrapper.commands
                         </Karaf-Commands>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/wrapper/src/main/java/org/apache/karaf/wrapper/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/wrapper/src/main/java/org/apache/karaf/wrapper/internal/osgi/Activator.java b/wrapper/src/main/java/org/apache/karaf/wrapper/internal/osgi/Activator.java
index 0cb8242..43aebe9 100644
--- a/wrapper/src/main/java/org/apache/karaf/wrapper/internal/osgi/Activator.java
+++ b/wrapper/src/main/java/org/apache/karaf/wrapper/internal/osgi/Activator.java
@@ -17,10 +17,13 @@
 package org.apache.karaf.wrapper.internal.osgi;
 
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 import org.apache.karaf.wrapper.WrapperService;
 import org.apache.karaf.wrapper.internal.WrapperServiceImpl;
 import org.apache.karaf.wrapper.management.internal.WrapperMBeanImpl;
 
+@Services(provides = @ProvideService(WrapperService.class))
 public class Activator extends BaseActivator {
 
     @Override


[3/4] git commit: [KARAF-413] Add a file or uri completer for cat command

Posted by gn...@apache.org.
[KARAF-413] Add a file or uri completer for cat command


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/17c4526f
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/17c4526f
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/17c4526f

Branch: refs/heads/master
Commit: 17c4526f17c8f326f1ce62418aad37fc06c85e5c
Parents: f9a03a3
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Fri May 16 10:43:25 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Mon May 19 09:19:09 2014 +0200

----------------------------------------------------------------------
 .../karaf/shell/commands/impl/CatAction.java    |  3 +++
 .../shell/impl/console/ConsoleSessionImpl.java  |  2 ++
 .../support/completers/FileOrUriCompleter.java  | 27 ++++++++++++++++++++
 3 files changed, 32 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/17c4526f/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/CatAction.java
----------------------------------------------------------------------
diff --git a/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/CatAction.java b/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/CatAction.java
index 41ec0a6..0471c56 100644
--- a/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/CatAction.java
+++ b/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/CatAction.java
@@ -31,8 +31,10 @@ import java.util.List;
 import org.apache.karaf.shell.api.action.Action;
 import org.apache.karaf.shell.api.action.Argument;
 import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
 import org.apache.karaf.shell.api.action.Option;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.support.completers.FileOrUriCompleter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,6 +54,7 @@ public class CatAction implements Action {
     private boolean stdin;
 
     @Argument(index = 0, name = "paths or urls", description = "A list of file paths or urls to display separated by whitespace (use - for STDIN)", required = false, multiValued = true)
+    @Completion(FileOrUriCompleter.class)
     private List<String> paths;
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/17c4526f/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
index dbfc59a..275cbc1 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/ConsoleSessionImpl.java
@@ -55,6 +55,7 @@ import org.apache.karaf.shell.api.console.SessionFactory;
 import org.apache.karaf.shell.api.console.Terminal;
 import org.apache.karaf.shell.support.ShellUtil;
 import org.apache.karaf.shell.support.completers.FileCompleter;
+import org.apache.karaf.shell.support.completers.FileOrUriCompleter;
 import org.apache.karaf.shell.support.completers.UriCompleter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -154,6 +155,7 @@ public class ConsoleSessionImpl implements Session {
         registry.register(new CommandNamesCompleter());
         registry.register(new FileCompleter());
         registry.register(new UriCompleter());
+        registry.register(new FileOrUriCompleter());
 
         // Session
         session = processor.createSession(in != null ? console : null, out, err);

http://git-wip-us.apache.org/repos/asf/karaf/blob/17c4526f/shell/core/src/main/java/org/apache/karaf/shell/support/completers/FileOrUriCompleter.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/support/completers/FileOrUriCompleter.java b/shell/core/src/main/java/org/apache/karaf/shell/support/completers/FileOrUriCompleter.java
new file mode 100644
index 0000000..4ba45b0
--- /dev/null
+++ b/shell/core/src/main/java/org/apache/karaf/shell/support/completers/FileOrUriCompleter.java
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.shell.support.completers;
+
+import java.util.Arrays;
+
+public class FileOrUriCompleter extends AggregateCompleter {
+
+    public FileOrUriCompleter() {
+        super(Arrays.asList(new FileCompleter(), new UriCompleter()));
+    }
+
+}


[4/4] git commit: [KARAF-2986] Use urls for features repository completion mapping

Posted by gn...@apache.org.
[KARAF-2986] Use urls for features repository completion mapping


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/f4ad8c4f
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/f4ad8c4f
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/f4ad8c4f

Branch: refs/heads/master
Commit: f4ad8c4fa0da86e8dc178608dc13ab2711a9e51b
Parents: 005c0a3
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Mon May 19 09:18:46 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Mon May 19 09:19:10 2014 +0200

----------------------------------------------------------------------
 .../etc/org.apache.karaf.features.repos.cfg     | 20 +++----
 .../features/internal/service/Artifact.java     | 56 --------------------
 .../internal/service/FeatureFinder.java         | 16 +++---
 3 files changed, 20 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/f4ad8c4f/assemblies/features/framework/src/main/resources/resources/etc/org.apache.karaf.features.repos.cfg
----------------------------------------------------------------------
diff --git a/assemblies/features/framework/src/main/resources/resources/etc/org.apache.karaf.features.repos.cfg b/assemblies/features/framework/src/main/resources/resources/etc/org.apache.karaf.features.repos.cfg
index 00844e9..7574897 100644
--- a/assemblies/features/framework/src/main/resources/resources/etc/org.apache.karaf.features.repos.cfg
+++ b/assemblies/features/framework/src/main/resources/resources/etc/org.apache.karaf.features.repos.cfg
@@ -22,13 +22,13 @@
 # It could be directly installed using feature:repo-add command
 #
 
-cellar       = org.apache.karaf.cellar:apache-karaf-cellar:xml:features:(0,]
-camel        = org.apache.camel.karaf:apache-camel:xml:features:(0,]
-camel-extras = org.apache-extras.camel-extra.karaf:camel-extra:xml:features:(0,]
-cxf          = org.apache.cxf.karaf:apache-cxf:xml:features:(0,]
-cxf-dosgi    = org.apache.cxf.dosgi:cxf-dosgi:xml:features:(0,]
-activemq     = org.apache.activemq:activemq-karaf:xml:features:(0,]
-jclouds      = org.jclouds.karaf:jclouds-karaf:xml:features:(0,]
-openejb      = org.apache.openejb:openejb-feature:xml:features:(0,]
-wicket       = org.ops4j.pax.wicket:features:xml:features:(0,]
-hawtio       = io.hawt:hawtio-karaf:xml:features:(0,]
+cellar       = mvn:org.apache.karaf.cellar/apache-karaf-cellar/${version}/xml/features
+camel        = mvn:org.apache.camel.karaf/apache-camel/${version}/xml/features
+camel-extras = mvn:org.apache-extras.camel-extra.karaf/camel-extra/${version}/xml/features
+cxf          = mvn:org.apache.cxf.karaf/apache-cxf/${version}/xml/features
+cxf-dosgi    = mvn:org.apache.cxf.dosgi/cxf-dosgi/${version}/xml/features
+activemq     = mvn:org.apache.activemq/activemq-karaf/${version}/xml/features
+jclouds      = mvn:org.jclouds.karaf/jclouds-karaf/${version}/xml/features
+openejb      = mvn:org.apache.openejb/openejb-feature/${version}/xml/features
+wicket       = mvn:org.ops4j.pax.wicket/features/${version}/xml/features
+hawtio       = mvn:io.hawt/hawtio-karaf/${version}/xml/features

http://git-wip-us.apache.org/repos/asf/karaf/blob/f4ad8c4f/features/core/src/main/java/org/apache/karaf/features/internal/service/Artifact.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/Artifact.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/Artifact.java
deleted file mode 100644
index d76acd8..0000000
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/Artifact.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.
- */
-package org.apache.karaf.features.internal.service;
-
-import java.net.URI;
-
-/**
- * Simple abstraction of a maven artifact to avoid external deps
- */
-public class Artifact {
-    String groupId;
-    String artifactId;
-    String version;
-    String extension;
-    String classifier;
-
-    public Artifact(String coords) {
-        String[] coordsAr = coords.split(":");
-        if (coordsAr.length != 5) {
-            throw new IllegalArgumentException("Maven URL " + coords + " is malformed or not complete");
-        }
-        this.groupId = coordsAr[0];
-        this.artifactId = coordsAr[1];
-        this.version = coordsAr[4];
-        this.extension = coordsAr[2];
-        this.classifier = coordsAr[3];
-    }
-
-    public Artifact(String coords, String version) {
-        this(coords);
-        this.version = version;
-    }
-
-    public URI getMavenUrl(String version) {
-        String uriSt = "mvn:" + this.groupId + "/" + this.artifactId + "/" + version + "/" + this.extension + "/" + this.classifier;
-        try {
-            return new URI(uriSt);
-        } catch (Exception e) {
-            return null;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/karaf/blob/f4ad8c4f/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureFinder.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureFinder.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureFinder.java
index d6defe0..8348ac0 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureFinder.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureFinder.java
@@ -23,12 +23,13 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.felix.utils.properties.InterpolationHelper;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 
 public class FeatureFinder implements ManagedService {
 
-    final Map<String, String> nameToArtifactMap = new HashMap<String, String>();
+    final Map<String, String> nameToArtifactMap = new HashMap<>();
 
     public String[] getNames() {
         synchronized (nameToArtifactMap) {
@@ -38,15 +39,18 @@ public class FeatureFinder implements ManagedService {
     }
 
     public URI getUriFor(String name, String version) {
-        String coords;
+        String url;
         synchronized (nameToArtifactMap) {
-            coords = nameToArtifactMap.get(name);
+            url = nameToArtifactMap.get(name);
         }
-        if (coords == null) {
+        if (url == null) {
             return null;
         }
-        Artifact artifact = new Artifact(coords);
-        return artifact.getMavenUrl(version);
+        Map<String, String> map = new HashMap<>();
+        map.put("url", url);
+        map.put("version", version);
+        InterpolationHelper.performSubstitution(map);
+        return URI.create(map.get("url"));
     }
 
     @SuppressWarnings("rawtypes")


[2/4] git commit: [KARAF-2985] Provide a plugin to automatically generate generic requirements / dependencies for karaf internal activators

Posted by gn...@apache.org.
[KARAF-2985] Provide a plugin to automatically generate generic requirements / dependencies for karaf internal activators


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/005c0a30
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/005c0a30
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/005c0a30

Branch: refs/heads/master
Commit: 005c0a30e773ee10ba9cd90f559ffaa6f7a3d5df
Parents: 17c4526
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Mon May 19 09:16:35 2014 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Mon May 19 09:19:09 2014 +0200

----------------------------------------------------------------------
 bundle/core/pom.xml                             |  10 ++
 .../bundle/core/internal/osgi/Activator.java    |  12 +-
 config/pom.xml                                  |  10 ++
 .../karaf/config/core/impl/osgi/Activator.java  |  12 +-
 deployer/blueprint/pom.xml                      |  10 ++
 .../deployer/blueprint/osgi/Activator.java      |   2 +-
 deployer/features/pom.xml                       |  15 ++
 .../karaf/deployer/features/osgi/Activator.java |  13 +-
 deployer/kar/pom.xml                            |  21 +++
 .../karaf/deployer/kar/osgi/Activator.java      |  10 +-
 deployer/spring/pom.xml                         |  10 ++
 .../karaf/deployer/spring/osgi/Activator.java   |   2 +-
 deployer/wrap/pom.xml                           |  10 ++
 .../karaf/deployer/wrap/osgi/Activator.java     |  17 +--
 diagnostic/pom.xml                              |  10 ++
 features/core/pom.xml                           |   8 +-
 .../karaf/features/internal/osgi/Activator.java |  17 ++-
 .../internal/region/SubsystemResolver.java      |  13 ++
 .../internal/resolver/ResourceUtils.java        |  10 ++
 .../features/internal/service/Deployer.java     |  18 ++-
 http/pom.xml                                    |   6 +
 .../http/core/internal/osgi/Activator.java      |   3 +
 instance/pom.xml                                |  15 +-
 .../instance/core/internal/osgi/Activator.java  |   3 +
 jaas/config/pom.xml                             |   3 +
 jdbc/pom.xml                                    |  10 ++
 .../karaf/jdbc/internal/osgi/Activator.java     |   3 +
 jndi/pom.xml                                    |  10 ++
 .../karaf/jndi/internal/osgi/Activator.java     |  11 +-
 kar/pom.xml                                     |   4 +
 .../karaf/kar/internal/osgi/Activator.java      |  15 +-
 log/pom.xml                                     |  10 ++
 .../karaf/log/core/internal/osgi/Activator.java |  15 +-
 management/server/pom.xml                       |   9 +-
 .../karaf/management/internal/Activator.java    |  19 ++-
 obr/pom.xml                                     |  10 ++
 .../karaf/obr/core/internal/osgi/Activator.java |  10 +-
 package/pom.xml                                 |  10 ++
 .../packages/core/internal/osgi/Activator.java  |   3 +
 pom.xml                                         |  40 ++---
 scheduler/pom.xml                               |  10 ++
 .../apache/karaf/scheduler/core/Activator.java  |   3 +
 .../osgi/secured/SecuredSessionFactoryImpl.java |   5 +-
 shell/ssh/pom.xml                               |  10 ++
 .../org/apache/karaf/shell/ssh/Activator.java   |  11 +-
 system/pom.xml                                  |  10 ++
 .../karaf/system/internal/osgi/Activator.java   |   3 +
 tooling/karaf-services-maven-plugin/pom.xml     | 142 ++++++++++++++++++
 .../tracker/GenerateServiceMetadata.java        | 148 +++++++++++++++++++
 tooling/pom.xml                                 |   1 +
 .../karaf/util/tracker/BaseActivator.java       |  81 ++++------
 .../org/apache/karaf/util/tracker/Managed.java  |  30 ++++
 .../karaf/util/tracker/ProvideService.java      |  27 ++++
 .../karaf/util/tracker/RequireService.java      |  31 ++++
 .../org/apache/karaf/util/tracker/Services.java |  32 ++++
 .../util/tracker/SingleServiceTracker.java      |  22 +--
 web/pom.xml                                     |  10 ++
 .../karaf/web/internal/osgi/Activator.java      |  14 +-
 wrapper/pom.xml                                 |  10 ++
 .../karaf/wrapper/internal/osgi/Activator.java  |   3 +
 60 files changed, 869 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/bundle/core/pom.xml
----------------------------------------------------------------------
diff --git a/bundle/core/pom.xml b/bundle/core/pom.xml
index fc99d53..1f568b7 100644
--- a/bundle/core/pom.xml
+++ b/bundle/core/pom.xml
@@ -115,6 +115,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -132,6 +136,12 @@
                             org.apache.felix.utils.version,
                             org.apache.felix.utils.manifest
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Embed-Dependency>
                             org.apache.karaf.jaas.modules;inline="org/apache/karaf/jaas/modules/JaasHelper*.class"
                         </Embed-Dependency>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/bundle/core/src/main/java/org/apache/karaf/bundle/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/bundle/core/src/main/java/org/apache/karaf/bundle/core/internal/osgi/Activator.java b/bundle/core/src/main/java/org/apache/karaf/bundle/core/internal/osgi/Activator.java
index 6999485..c5c765b 100644
--- a/bundle/core/src/main/java/org/apache/karaf/bundle/core/internal/osgi/Activator.java
+++ b/bundle/core/src/main/java/org/apache/karaf/bundle/core/internal/osgi/Activator.java
@@ -24,22 +24,24 @@ import org.apache.karaf.bundle.core.internal.BundleWatcherImpl;
 import org.apache.karaf.bundle.core.internal.BundlesMBeanImpl;
 import org.apache.karaf.bundle.core.internal.MavenConfigService;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
+@Services(
+        requires = @RequireService(ConfigurationAdmin.class),
+        provides = @ProvideService(BundleService.class)
+)
 public class Activator extends BaseActivator {
 
     private ServiceTracker<BundleStateService, BundleStateService> bundleStateServicesTracker;
     private BundleWatcherImpl bundleWatcher;
 
     @Override
-    protected void doOpen() throws Exception {
-        trackService(ConfigurationAdmin.class);
-    }
-
-    @Override
     protected void doStart() throws Exception {
         ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class);
         if (configurationAdmin == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/config/pom.xml
----------------------------------------------------------------------
diff --git a/config/pom.xml b/config/pom.xml
index af0de85..84be65e 100644
--- a/config/pom.xml
+++ b/config/pom.xml
@@ -91,6 +91,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -107,6 +111,12 @@
                             org.apache.karaf.config.core.impl.osgi,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.config.core.impl.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java b/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
index bdfab09..ca5268f 100644
--- a/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
+++ b/config/src/main/java/org/apache/karaf/config/core/impl/osgi/Activator.java
@@ -20,15 +20,17 @@ import org.apache.karaf.config.core.ConfigRepository;
 import org.apache.karaf.config.core.impl.ConfigMBeanImpl;
 import org.apache.karaf.config.core.impl.ConfigRepositoryImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.osgi.service.cm.ConfigurationAdmin;
 
+@Services(
+        requires = @RequireService(ConfigurationAdmin.class),
+        provides = @ProvideService(ConfigRepository.class)
+)
 public class Activator extends BaseActivator {
 
-    @Override
-    protected void doOpen() throws Exception {
-        trackService(ConfigurationAdmin.class);
-    }
-
     protected void doStart() throws Exception {
         ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class);
         if (configurationAdmin == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/blueprint/pom.xml
----------------------------------------------------------------------
diff --git a/deployer/blueprint/pom.xml b/deployer/blueprint/pom.xml
index 008f533..3fa0fea 100644
--- a/deployer/blueprint/pom.xml
+++ b/deployer/blueprint/pom.xml
@@ -84,6 +84,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -95,6 +99,12 @@
                             org.apache.karaf.util,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.deployer.blueprint.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/osgi/Activator.java b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/osgi/Activator.java
index 5251150..fe9f0dc 100644
--- a/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/osgi/Activator.java
+++ b/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/osgi/Activator.java
@@ -33,7 +33,7 @@ public class Activator extends BaseActivator {
         Hashtable<String, Object> props = new Hashtable<String, Object>();
         props.put("url.handler.protocol", "blueprint");
         register(URLStreamHandlerService.class, new BlueprintURLHandler(), props);
-        register(new String[]{ArtifactUrlTransformer.class.getName(), ArtifactListener.class.getName()},
+        register(new Class[] { ArtifactUrlTransformer.class, ArtifactListener.class },
                 new BlueprintDeploymentListener());
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/features/pom.xml
----------------------------------------------------------------------
diff --git a/deployer/features/pom.xml b/deployer/features/pom.xml
index c3414a0..9a1bbbd 100644
--- a/deployer/features/pom.xml
+++ b/deployer/features/pom.xml
@@ -54,6 +54,11 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.springframework.osgi</groupId>
             <artifactId>spring-osgi-core</artifactId>
             <scope>provided</scope>
@@ -87,6 +92,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -98,6 +107,12 @@
                             org.apache.karaf.util,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.deployer.features.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/features/src/main/java/org/apache/karaf/deployer/features/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/deployer/features/src/main/java/org/apache/karaf/deployer/features/osgi/Activator.java b/deployer/features/src/main/java/org/apache/karaf/deployer/features/osgi/Activator.java
index cffb688..43c5ba3 100644
--- a/deployer/features/src/main/java/org/apache/karaf/deployer/features/osgi/Activator.java
+++ b/deployer/features/src/main/java/org/apache/karaf/deployer/features/osgi/Activator.java
@@ -25,18 +25,16 @@ import org.apache.karaf.deployer.features.FeatureDeploymentListener;
 import org.apache.karaf.deployer.features.FeatureURLHandler;
 import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.osgi.service.url.URLStreamHandlerService;
 
+@Services(requires = @RequireService(FeaturesService.class))
 public class Activator extends BaseActivator {
 
     private FeatureDeploymentListener listener;
 
     @Override
-    protected void doOpen() throws Exception {
-        trackService(FeaturesService.class);
-    }
-
-    @Override
     protected void doStart() throws Exception {
         FeaturesService service = getTrackedService(FeaturesService.class);
         if (service == null) {
@@ -52,9 +50,8 @@ public class Activator extends BaseActivator {
         listener.setFeaturesService(service);
         listener.setBundleContext(bundleContext);
         listener.init();
-        register(new String[]{
-                ArtifactUrlTransformer.class.getName(), ArtifactListener.class.getName()
-        }, listener);
+        register(new Class[] { ArtifactUrlTransformer.class, ArtifactListener.class },
+                 listener);
     }
 
     protected void doStop() {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/kar/pom.xml
----------------------------------------------------------------------
diff --git a/deployer/kar/pom.xml b/deployer/kar/pom.xml
index d90dbac..45228a6 100644
--- a/deployer/kar/pom.xml
+++ b/deployer/kar/pom.xml
@@ -53,6 +53,17 @@
             <artifactId>org.osgi.core</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.karaf.kar</groupId>
@@ -90,6 +101,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -100,6 +115,12 @@
                             org.apache.karaf.deployer.kar.osgi,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.deployer.kar.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/osgi/Activator.java b/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/osgi/Activator.java
index ac3b520..e86e7cf 100644
--- a/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/osgi/Activator.java
+++ b/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/osgi/Activator.java
@@ -22,21 +22,19 @@ import org.apache.felix.fileinstall.ArtifactListener;
 import org.apache.karaf.deployer.kar.KarArtifactInstaller;
 import org.apache.karaf.kar.KarService;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(requires = @RequireService(KarService.class))
 public class Activator extends BaseActivator {
 
     @Override
-    protected void doOpen() throws Exception {
-        trackService(KarService.class);
-    }
-
-    @Override
     protected void doStart() throws Exception {
         KarService service = getTrackedService(KarService.class);
         if (service != null) {
             KarArtifactInstaller installer = new KarArtifactInstaller();
             installer.setKarService(service);
-            register(new String[] { ArtifactInstaller.class.getName(), ArtifactListener.class.getName() },
+            register(new Class[] { ArtifactInstaller.class, ArtifactListener.class },
                      installer);
         }
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/spring/pom.xml
----------------------------------------------------------------------
diff --git a/deployer/spring/pom.xml b/deployer/spring/pom.xml
index a812842..28f4f3c 100644
--- a/deployer/spring/pom.xml
+++ b/deployer/spring/pom.xml
@@ -88,6 +88,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -99,6 +103,12 @@
                             org.apache.karaf.util,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.deployer.spring.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/osgi/Activator.java b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/osgi/Activator.java
index 116524c..d878e99 100644
--- a/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/osgi/Activator.java
+++ b/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/osgi/Activator.java
@@ -33,7 +33,7 @@ public class Activator extends BaseActivator {
         Hashtable<String, Object> props = new Hashtable<String, Object>();
         props.put("url.handler.protocol", "spring");
         register(URLStreamHandlerService.class, new SpringURLHandler(), props);
-        register(new String[] { ArtifactUrlTransformer.class.getName(), ArtifactListener.class.getName() },
+        register(new Class[] { ArtifactUrlTransformer.class, ArtifactListener.class },
                  new SpringDeploymentListener());
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/wrap/pom.xml
----------------------------------------------------------------------
diff --git a/deployer/wrap/pom.xml b/deployer/wrap/pom.xml
index 12269d4..c02bc2d 100644
--- a/deployer/wrap/pom.xml
+++ b/deployer/wrap/pom.xml
@@ -73,6 +73,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -84,6 +88,12 @@
                             org.apache.karaf.util,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.deployer.wrap.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/osgi/Activator.java b/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/osgi/Activator.java
index e992f91..4486492 100644
--- a/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/osgi/Activator.java
+++ b/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/osgi/Activator.java
@@ -22,22 +22,15 @@ import java.util.Hashtable;
 import org.apache.felix.fileinstall.ArtifactUrlTransformer;
 import org.apache.karaf.deployer.wrap.WrapDeploymentListener;
 import org.apache.karaf.util.tracker.BaseActivator;
-import org.apache.karaf.util.tracker.SingleServiceTracker;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.osgi.service.url.URLStreamHandlerService;
 
+@Services(requires = {
+    @RequireService(value = URLStreamHandlerService.class, filter = "(url.handler.protocol=wrap)")
+})
 public class Activator extends BaseActivator {
 
-    private BundleContext bundleContext;
-    private ServiceRegistration<ArtifactUrlTransformer> urlTransformerRegistration;
-    private SingleServiceTracker<URLStreamHandlerService> urlHandlerTracker;
-
-    @Override
-    protected void doOpen() throws Exception {
-        trackService(URLStreamHandlerService.class, "(url.handler.protocol=wrap)");
-    }
-
     @Override
     protected void doStart() throws Exception {
         Hashtable<String, Object> props = new Hashtable<String, Object>();

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/diagnostic/pom.xml
----------------------------------------------------------------------
diff --git a/diagnostic/pom.xml b/diagnostic/pom.xml
index c89a72d..cacb84f 100644
--- a/diagnostic/pom.xml
+++ b/diagnostic/pom.xml
@@ -87,6 +87,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -106,6 +110,12 @@
                             org.apache.karaf.util,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.diagnostic.core.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/features/core/pom.xml
----------------------------------------------------------------------
diff --git a/features/core/pom.xml b/features/core/pom.xml
index 7972022..2a78de9 100644
--- a/features/core/pom.xml
+++ b/features/core/pom.xml
@@ -108,6 +108,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -125,12 +129,10 @@
                             !org.eclipse.osgi.service.resolver,
                             *
                         </Import-Package>
-                        <Provide-Capability>
-                            osgi.service;effective:=active;objectClass=org.apache.karaf.features.FeaturesService
-                        </Provide-Capability>
                         <Private-Package>
                             org.apache.karaf.features.internal.*,
                             org.apache.felix.resolver,
+                            org.apache.felix.utils.collections,
                             org.apache.felix.utils.version,
                             org.apache.felix.utils.properties,
                             org.apache.felix.utils.manifest,

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
index 5db6204..3be20e5 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
@@ -45,6 +45,9 @@ import org.apache.karaf.features.internal.service.FeatureFinder;
 import org.apache.karaf.features.internal.service.FeaturesServiceImpl;
 import org.apache.karaf.features.internal.service.StateStorage;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.eclipse.equinox.internal.region.DigraphHelper;
 import org.eclipse.equinox.internal.region.StandardRegionDigraph;
 import org.eclipse.equinox.internal.region.management.StandardManageableRegionDigraph;
@@ -62,6 +65,17 @@ import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.LoggerFactory;
 
+@Services(
+    requires = {
+            @RequireService(ConfigurationAdmin.class),
+            @RequireService(value = URLStreamHandlerService.class, filter = "(url.handler.protocol=mvn)")
+    },
+    provides = {
+            @ProvideService(FeaturesService.class),
+            @ProvideService(RegionDigraph.class),
+            @ProvideService(Resolver.class)
+    }
+)
 public class Activator extends BaseActivator {
 
     public static final String FEATURES_REPOS_PID = "org.apache.karaf.features.repos";
@@ -82,8 +96,7 @@ public class Activator extends BaseActivator {
 
     @Override
     protected void doOpen() throws Exception {
-        trackService(URLStreamHandlerService.class, "(url.handler.protocol=mvn)");
-        trackService(ConfigurationAdmin.class);
+        super.doOpen();
 
         Properties configuration = new Properties();
         File configFile = new File(System.getProperty("karaf.etc"), FEATURES_SERVICE_CONFIG_FILE);

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
index d3b826f..2682e58 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolver.java
@@ -26,12 +26,14 @@ import java.util.Set;
 
 import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.resolver.Util;
+import org.apache.felix.utils.collections.DictionaryAsMap;
 import org.apache.karaf.features.BundleInfo;
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.internal.download.DownloadManager;
 import org.apache.karaf.features.internal.download.Downloader;
 import org.apache.karaf.features.internal.download.StreamProvider;
 import org.apache.karaf.features.internal.download.simple.SimpleDownloader;
+import org.apache.karaf.features.internal.resolver.CapabilityImpl;
 import org.apache.karaf.features.internal.resolver.CapabilitySet;
 import org.apache.karaf.features.internal.resolver.ResourceBuilder;
 import org.apache.karaf.features.internal.resolver.ResourceImpl;
@@ -45,6 +47,7 @@ import org.osgi.framework.BundleException;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.Version;
 import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.namespace.service.ServiceNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
@@ -146,7 +149,16 @@ public class SubsystemResolver {
                 ss = ss.getChild(path);
             }
             if (ss != null) {
+                ResourceImpl dummy = new ResourceImpl("dummy", "dummy", Version.emptyVersion);
                 for (BundleRevision res : entry.getValue()) {
+                    // We need to explicitely provide service capabilities for bundles
+                    // We use both actual services and services declared from the headers
+                    // TODO: use actual services
+                    Map<String, String> headers = new DictionaryAsMap<>(res.getBundle().getHeaders());
+                    Resource tmp = ResourceBuilder.build(res.getBundle().getLocation(), headers);
+                    for (Capability cap : tmp.getCapabilities(ServiceNamespace.SERVICE_NAMESPACE)) {
+                        dummy.addCapability(new CapabilityImpl(dummy, cap.getNamespace(), cap.getDirectives() ,cap.getAttributes()));
+                    }
                     ss.addSystemResource(res);
                     for (Capability cap : res.getCapabilities(null)) {
                         hasEeCap |= cap.getNamespace().equals(EXECUTION_ENVIRONMENT_NAMESPACE);
@@ -155,6 +167,7 @@ public class SubsystemResolver {
                         sysBundleRev = res;
                     }
                 }
+                ss.addSystemResource(dummy);
             }
         }
         // Under Equinox, the osgi.ee capabilities are not provided by the system bundle

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
index 9657689..d6cfe1d 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
@@ -43,6 +43,16 @@ public final class ResourceUtils {
     private ResourceUtils() {
     }
 
+    public static String getType(Resource resource) {
+        List<Capability> caps = resource.getCapabilities(null);
+        for (Capability cap : caps) {
+            if (cap.getNamespace().equals(IDENTITY_NAMESPACE)) {
+                return cap.getAttributes().get(CAPABILITY_TYPE_ATTRIBUTE).toString();
+            }
+        }
+        return null;
+    }
+
     public static String getUri(Resource resource) {
         List<Capability> caps = resource.getCapabilities(null);
         for (Capability cap : caps) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
index c636fbe..5a1cd02 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/Deployer.java
@@ -70,6 +70,7 @@ import static org.apache.felix.resolver.Util.getVersion;
 import static org.apache.karaf.features.FeaturesService.ROOT_REGION;
 import static org.apache.karaf.features.internal.resolver.ResourceUtils.TYPE_SUBSYSTEM;
 import static org.apache.karaf.features.internal.resolver.ResourceUtils.getFeatureId;
+import static org.apache.karaf.features.internal.resolver.ResourceUtils.getType;
 import static org.apache.karaf.features.internal.resolver.ResourceUtils.getUri;
 import static org.apache.karaf.features.FeaturesService.UPDATEABLE_URIS;
 import static org.apache.karaf.features.FeaturesService.UPDATE_SNAPSHOTS_ALWAYS;
@@ -88,8 +89,8 @@ import static org.osgi.framework.Bundle.STARTING;
 import static org.osgi.framework.Bundle.STOPPING;
 import static org.osgi.framework.Bundle.STOP_TRANSIENT;
 import static org.osgi.framework.Bundle.UNINSTALLED;
-import static org.osgi.framework.namespace.IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE;
 import static org.osgi.framework.namespace.IdentityNamespace.IDENTITY_NAMESPACE;
+import static org.osgi.framework.namespace.IdentityNamespace.TYPE_BUNDLE;
 import static org.osgi.resource.Namespace.CAPABILITY_EFFECTIVE_DIRECTIVE;
 import static org.osgi.resource.Namespace.EFFECTIVE_ACTIVE;
 
@@ -749,13 +750,11 @@ public class Deployer {
     }
 
     private boolean isSubsystem(Resource resource) {
-        for (Capability cap : resource.getCapabilities(null)) {
-            if (cap.getNamespace().equals(IDENTITY_NAMESPACE)) {
-                String type = (String) cap.getAttributes().get(CAPABILITY_TYPE_ATTRIBUTE);
-                return (type != null) && type.equals(TYPE_SUBSYSTEM);
-            }
-        }
-        return false;
+        return TYPE_SUBSYSTEM.equals(getType(resource));
+    }
+
+    private boolean isBundle(Resource resource) {
+        return TYPE_BUNDLE.equals(getType(resource));
     }
 
     private FeaturesService.RequestedState mergeStates(FeaturesService.RequestedState s1, FeaturesService.RequestedState s2) {
@@ -795,6 +794,9 @@ public class Deployer {
                 List<Wire> newWires = resolution.get(wiring.getRevision());
                 if (newWires != null) {
                     for (Wire wire : newWires) {
+                        if (!isBundle(wire.getProvider())) {
+                            continue;
+                        }
                         Bundle b;
                         if (wire.getProvider() instanceof BundleRevision) {
                             b = ((BundleRevision) wire.getProvider()).getBundle();

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/http/pom.xml
----------------------------------------------------------------------
diff --git a/http/pom.xml b/http/pom.xml
index e162765..df78746 100644
--- a/http/pom.xml
+++ b/http/pom.xml
@@ -104,6 +104,12 @@
                             org.apache.felix.utils.version,
                             org.apache.felix.utils.manifest,
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.http.core.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/http/src/main/java/org/apache/karaf/http/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/http/src/main/java/org/apache/karaf/http/core/internal/osgi/Activator.java b/http/src/main/java/org/apache/karaf/http/core/internal/osgi/Activator.java
index a294229..9eb4b21 100644
--- a/http/src/main/java/org/apache/karaf/http/core/internal/osgi/Activator.java
+++ b/http/src/main/java/org/apache/karaf/http/core/internal/osgi/Activator.java
@@ -21,8 +21,11 @@ import org.apache.karaf.http.core.internal.HttpMBeanImpl;
 import org.apache.karaf.http.core.internal.ServletEventHandler;
 import org.apache.karaf.http.core.internal.ServletServiceImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 import org.ops4j.pax.web.service.spi.ServletListener;
 
+@Services(provides = @ProvideService(ServletService.class))
 public class Activator extends BaseActivator {
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/instance/pom.xml
----------------------------------------------------------------------
diff --git a/instance/pom.xml b/instance/pom.xml
index bd04934..55948fa 100644
--- a/instance/pom.xml
+++ b/instance/pom.xml
@@ -47,6 +47,12 @@
         </dependency>
 
         <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
             <scope>provided</scope>
@@ -148,6 +154,10 @@
                 </executions>
             </plugin>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -164,8 +174,11 @@
                             *
                         </Import-Package>
                         <Provide-Capability>
-                            osgi.service;effective:=active;objectClass=org.apache.karaf.instance.core.InstanceService
+                            ${capabilities}
                         </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Private-Package>
                             org.apache.karaf.jpm,
                             org.apache.karaf.jpm.impl,

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/instance/src/main/java/org/apache/karaf/instance/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/instance/src/main/java/org/apache/karaf/instance/core/internal/osgi/Activator.java b/instance/src/main/java/org/apache/karaf/instance/core/internal/osgi/Activator.java
index a50db46..17f68c9 100644
--- a/instance/src/main/java/org/apache/karaf/instance/core/internal/osgi/Activator.java
+++ b/instance/src/main/java/org/apache/karaf/instance/core/internal/osgi/Activator.java
@@ -20,7 +20,10 @@ import org.apache.karaf.instance.core.InstanceService;
 import org.apache.karaf.instance.core.internal.InstanceServiceImpl;
 import org.apache.karaf.instance.core.internal.InstancesMBeanImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(provides = @ProvideService(InstanceService.class))
 public class Activator extends BaseActivator {
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/jaas/config/pom.xml
----------------------------------------------------------------------
diff --git a/jaas/config/pom.xml b/jaas/config/pom.xml
index f66ad75..2c561f2 100644
--- a/jaas/config/pom.xml
+++ b/jaas/config/pom.xml
@@ -108,6 +108,9 @@
                         <Private-Package>
                             org.apache.karaf.util.collections
                         </Private-Package>
+                        <Provide-Capability>
+                            osgi.service;effective:=active;objectClass="org.apache.karaf.jaas.config.KeystoreManager
+                        </Provide-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.jaas.config.impl.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/jdbc/pom.xml
----------------------------------------------------------------------
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
index be8ef62..41bc234 100644
--- a/jdbc/pom.xml
+++ b/jdbc/pom.xml
@@ -73,6 +73,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -88,6 +92,12 @@
                             org.apache.karaf.util,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.jdbc.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/jdbc/src/main/java/org/apache/karaf/jdbc/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/karaf/jdbc/internal/osgi/Activator.java b/jdbc/src/main/java/org/apache/karaf/jdbc/internal/osgi/Activator.java
index 8ede97a..8fe66a7 100644
--- a/jdbc/src/main/java/org/apache/karaf/jdbc/internal/osgi/Activator.java
+++ b/jdbc/src/main/java/org/apache/karaf/jdbc/internal/osgi/Activator.java
@@ -20,7 +20,10 @@ import org.apache.karaf.jdbc.JdbcService;
 import org.apache.karaf.jdbc.internal.JdbcMBeanImpl;
 import org.apache.karaf.jdbc.internal.JdbcServiceImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(provides = @ProvideService(JdbcService.class))
 public class Activator extends BaseActivator {
     @Override
     protected void doStart() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/jndi/pom.xml
----------------------------------------------------------------------
diff --git a/jndi/pom.xml b/jndi/pom.xml
index 1b01030..d7b8df6 100644
--- a/jndi/pom.xml
+++ b/jndi/pom.xml
@@ -81,6 +81,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -95,6 +99,12 @@
                             org.apache.karaf.jndi.internal.osgi,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Karaf-Commands>*</Karaf-Commands>
                         <Bundle-Activator>
                             org.apache.karaf.jndi.internal.osgi.Activator

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/jndi/src/main/java/org/apache/karaf/jndi/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/jndi/src/main/java/org/apache/karaf/jndi/internal/osgi/Activator.java b/jndi/src/main/java/org/apache/karaf/jndi/internal/osgi/Activator.java
index 5470e7e..bc6baa8 100644
--- a/jndi/src/main/java/org/apache/karaf/jndi/internal/osgi/Activator.java
+++ b/jndi/src/main/java/org/apache/karaf/jndi/internal/osgi/Activator.java
@@ -26,12 +26,15 @@ import org.apache.karaf.jndi.KarafInitialContextFactory;
 import org.apache.karaf.jndi.internal.JndiMBeanImpl;
 import org.apache.karaf.jndi.internal.JndiServiceImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(
+        requires = @RequireService(ProxyManager.class),
+        provides = @ProvideService(JndiService.class)
+)
 public class Activator extends BaseActivator {
-    @Override
-    protected void doOpen() throws Exception {
-        trackService(ProxyManager.class);
-    }
 
     @Override
     protected void doStart() throws Exception {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/kar/pom.xml
----------------------------------------------------------------------
diff --git a/kar/pom.xml b/kar/pom.xml
index f32eaf7..d513632 100644
--- a/kar/pom.xml
+++ b/kar/pom.xml
@@ -98,6 +98,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/kar/src/main/java/org/apache/karaf/kar/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/kar/src/main/java/org/apache/karaf/kar/internal/osgi/Activator.java b/kar/src/main/java/org/apache/karaf/kar/internal/osgi/Activator.java
index 05a1b59..5db2141 100644
--- a/kar/src/main/java/org/apache/karaf/kar/internal/osgi/Activator.java
+++ b/kar/src/main/java/org/apache/karaf/kar/internal/osgi/Activator.java
@@ -21,16 +21,19 @@ import org.apache.karaf.kar.KarService;
 import org.apache.karaf.kar.internal.KarServiceImpl;
 import org.apache.karaf.kar.internal.KarsMBeanImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.Managed;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.osgi.service.cm.ManagedService;
 
+@Services(
+        requires = @RequireService(FeaturesService.class),
+        provides = @ProvideService(KarService.class)
+)
+@Managed("org.apache.karaf.kar")
 public class Activator extends BaseActivator implements ManagedService {
 
-    @Override
-    protected void doOpen() throws Exception {
-        manage("org.apache.karaf.kar");
-        trackService(FeaturesService.class);
-    }
-
     protected void doStart() throws Exception {
         FeaturesService featuresService = getTrackedService(FeaturesService.class);
         if (featuresService == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/log/pom.xml
----------------------------------------------------------------------
diff --git a/log/pom.xml b/log/pom.xml
index 5dec97a..4b3ba9c 100644
--- a/log/pom.xml
+++ b/log/pom.xml
@@ -90,6 +90,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -107,6 +111,12 @@
                             org.apache.karaf.log.core.internal.osgi,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.log.core.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java b/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
index 2e8c4d8..8540ff0 100644
--- a/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
+++ b/log/src/main/java/org/apache/karaf/log/core/internal/osgi/Activator.java
@@ -25,18 +25,21 @@ import org.apache.karaf.log.core.internal.LogMBeanImpl;
 import org.apache.karaf.log.core.internal.LogServiceImpl;
 import org.apache.karaf.log.core.internal.LruList;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.Managed;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.ops4j.pax.logging.spi.PaxAppender;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ManagedService;
 
+@Services(
+        requires = @RequireService(ConfigurationAdmin.class),
+        provides = @ProvideService(LogService.class)
+)
+@Managed("org.apache.karaf.log")
 public class Activator extends BaseActivator implements ManagedService {
 
-    @Override
-    protected void doOpen() throws Exception {
-        manage("org.apache.karaf.log");
-        trackService(ConfigurationAdmin.class);
-    }
-
     protected void doStart() throws Exception {
         ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class);
         if (configurationAdmin == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/management/server/pom.xml
----------------------------------------------------------------------
diff --git a/management/server/pom.xml b/management/server/pom.xml
index 1722865..670b024 100644
--- a/management/server/pom.xml
+++ b/management/server/pom.xml
@@ -107,6 +107,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -119,8 +123,11 @@
                             org.apache.karaf.util.tracker
                         </Private-Package>
                         <Provide-Capability>
-                            osgi.service;effective:=active;objectClass=javax.management.MBeanServer
+                            ${capabilities}
                         </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.management.internal.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java
----------------------------------------------------------------------
diff --git a/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java b/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java
index 8745d82..45bce44 100644
--- a/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java
+++ b/management/server/src/main/java/org/apache/karaf/management/internal/Activator.java
@@ -29,22 +29,27 @@ import org.apache.karaf.management.KarafMBeanServerGuard;
 import org.apache.karaf.management.MBeanServerFactory;
 import org.apache.karaf.management.RmiRegistryFactory;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.Managed;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ManagedService;
 
+@Services(
+        requires = {
+                @RequireService(ConfigurationAdmin.class),
+                @RequireService(KeystoreManager.class)
+        },
+        provides = @ProvideService(MBeanServer.class)
+)
+@Managed("org.apache.karaf.management")
 public class Activator extends BaseActivator implements ManagedService {
 
     private ConnectorServerFactory connectorServerFactory;
     private RmiRegistryFactory rmiRegistryFactory;
     private MBeanServerFactory mbeanServerFactory;
 
-    @Override
-    protected void doOpen() throws Exception {
-        manage("org.apache.karaf.management");
-        trackService(ConfigurationAdmin.class);
-        trackService(KeystoreManager.class);
-    }
-
     protected void doStart() throws Exception {
         // Verify dependencies
         ConfigurationAdmin configurationAdmin = getTrackedService(ConfigurationAdmin.class);

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/obr/pom.xml
----------------------------------------------------------------------
diff --git a/obr/pom.xml b/obr/pom.xml
index 1e9b381..32ab70b 100644
--- a/obr/pom.xml
+++ b/obr/pom.xml
@@ -79,6 +79,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -93,6 +97,12 @@
                             org.apache.karaf.obr.core.internal.osgi,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.obr.core.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/obr/src/main/java/org/apache/karaf/obr/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/obr/src/main/java/org/apache/karaf/obr/core/internal/osgi/Activator.java b/obr/src/main/java/org/apache/karaf/obr/core/internal/osgi/Activator.java
index 183508e..70f3f23 100644
--- a/obr/src/main/java/org/apache/karaf/obr/core/internal/osgi/Activator.java
+++ b/obr/src/main/java/org/apache/karaf/obr/core/internal/osgi/Activator.java
@@ -19,15 +19,15 @@ package org.apache.karaf.obr.core.internal.osgi;
 import org.apache.felix.bundlerepository.RepositoryAdmin;
 import org.apache.karaf.obr.core.internal.ObrMBeanImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(
+        requires = @RequireService(RepositoryAdmin.class)
+)
 public class Activator extends BaseActivator {
 
     @Override
-    protected void doOpen() throws Exception {
-        trackService(RepositoryAdmin.class);
-    }
-
-    @Override
     protected void doStart() throws Exception {
         RepositoryAdmin admin = getTrackedService(RepositoryAdmin.class);
         ObrMBeanImpl mbean = new ObrMBeanImpl(bundleContext, admin);

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/package/pom.xml
----------------------------------------------------------------------
diff --git a/package/pom.xml b/package/pom.xml
index 8c3e1a1..c3a774a 100644
--- a/package/pom.xml
+++ b/package/pom.xml
@@ -100,6 +100,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -115,6 +119,12 @@
                             org.apache.felix.utils.version,
                             org.apache.felix.utils.manifest
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.packages.core.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/package/src/main/java/org/apache/karaf/packages/core/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/package/src/main/java/org/apache/karaf/packages/core/internal/osgi/Activator.java b/package/src/main/java/org/apache/karaf/packages/core/internal/osgi/Activator.java
index ea8ce1d..bf5f526 100644
--- a/package/src/main/java/org/apache/karaf/packages/core/internal/osgi/Activator.java
+++ b/package/src/main/java/org/apache/karaf/packages/core/internal/osgi/Activator.java
@@ -20,7 +20,10 @@ import org.apache.karaf.packages.core.PackageService;
 import org.apache.karaf.packages.core.internal.PackageServiceImpl;
 import org.apache.karaf.packages.core.internal.PackagesMBeanImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(provides = @ProvideService(PackageService.class))
 public class Activator extends BaseActivator {
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ccd2259..8aeb574 100644
--- a/pom.xml
+++ b/pom.xml
@@ -162,7 +162,7 @@
         <felix.framework.version>4.4.0</felix.framework.version>
         <felix.framework.security.version>2.4.0</felix.framework.security.version>
         <felix.gogo.version>0.12.0</felix.gogo.version>
-        <felix.plugin.version>2.4.0</felix.plugin.version>
+        <felix.plugin.version>2.4.1-SNAPSHOT</felix.plugin.version>
         <felix.utils.version>1.6.0</felix.utils.version>
         <felix.webconsole.version>4.2.0</felix.webconsole.version>
         <felix.webconsole.api.version>3.1.2</felix.webconsole.api.version>
@@ -1884,23 +1884,6 @@
                     </configuration>
                 </plugin>
                 <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-bundle-plugin</artifactId>
-                    <version>${felix.plugin.version}</version>
-                    <extensions>true</extensions>
-                    <configuration>
-                        <instructions>
-                            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                            <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
-                            <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                            <!--
-                            <nsh_interface>org.apache.aries.blueprint.NamespaceHandler</nsh_interface>
-                            <nsh_namespace>osgi.service.blueprint.namespace</nsh_namespace>
-                            -->
-                        </instructions>
-                    </configuration>
-                </plugin>
-                <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-idea-plugin</artifactId>
                     <version>2.2.1</version>
@@ -2074,6 +2057,20 @@
                         </lifecycleMappingMetadata>
                     </configuration>
                 </plugin>
+                <plugin>
+                    <groupId>org.apache.karaf.tooling</groupId>
+                    <artifactId>karaf-services-maven-plugin</artifactId>
+                    <version>${project.version}</version>
+                    <executions>
+                        <execution>
+                            <id>service-metadata-generate</id>
+                            <phase>process-classes</phase>
+                            <goals>
+                                <goal>service-metadata-generate</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
             </plugins>
         </pluginManagement>
         <plugins>
@@ -2133,12 +2130,17 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
+                <version>${felix.plugin.version}</version>
                 <inherited>true</inherited>
+                <extensions>true</extensions>
                 <configuration>
                     <instructions>
                         <nsh_interface>org.apache.aries.blueprint.NamespaceHandler</nsh_interface>
                         <nsh_namespace>osgi.service.blueprint.namespace</nsh_namespace>
-                        <_removeheaders>Private-Package,Include-Resource</_removeheaders>
+                        <_removeheaders>Private-Package,Include-Resource,Embed-Dependency,Created-By,Bnd-LastModified,Built-By,Tool</_removeheaders>
+                        <Bundle-DocURL>http://karaf.apache.org/</Bundle-DocURL>
+                        <Provide-Capability>${capabilities}</Provide-Capability>
+                        <Require-Capability>${requirements}</Require-Capability>
                     </instructions>
                 </configuration>
                 <executions>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/scheduler/pom.xml
----------------------------------------------------------------------
diff --git a/scheduler/pom.xml b/scheduler/pom.xml
index 9ea1cf0..9d5287f 100644
--- a/scheduler/pom.xml
+++ b/scheduler/pom.xml
@@ -52,6 +52,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -81,6 +85,12 @@
                             org.quartz.simpl.*,
                             org.quartz.utils.*,
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                     </instructions>
                 </configuration>
             </plugin>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/scheduler/src/main/java/org/apache/karaf/scheduler/core/Activator.java
----------------------------------------------------------------------
diff --git a/scheduler/src/main/java/org/apache/karaf/scheduler/core/Activator.java b/scheduler/src/main/java/org/apache/karaf/scheduler/core/Activator.java
index 925d35b..81f6ede 100644
--- a/scheduler/src/main/java/org/apache/karaf/scheduler/core/Activator.java
+++ b/scheduler/src/main/java/org/apache/karaf/scheduler/core/Activator.java
@@ -18,9 +18,12 @@ package org.apache.karaf.scheduler.core;
 
 import org.apache.karaf.scheduler.Scheduler;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 import org.quartz.simpl.SimpleThreadPool;
 import org.quartz.spi.ThreadPool;
 
+@Services(provides = @ProvideService(Scheduler.class))
 public class Activator extends BaseActivator {
 
     private ThreadPool threadPool;

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/shell/core/src/main/java/org/apache/karaf/shell/impl/console/osgi/secured/SecuredSessionFactoryImpl.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/osgi/secured/SecuredSessionFactoryImpl.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/osgi/secured/SecuredSessionFactoryImpl.java
index 6c4048a..def3bd1 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/osgi/secured/SecuredSessionFactoryImpl.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/osgi/secured/SecuredSessionFactoryImpl.java
@@ -40,6 +40,7 @@ import org.apache.karaf.shell.impl.console.SessionFactoryImpl;
 import org.apache.karaf.util.tracker.SingleServiceTracker;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
@@ -61,11 +62,11 @@ public class SecuredSessionFactoryImpl extends SessionFactoryImpl implements Con
     private SingleServiceTracker<ConfigurationAdmin> configAdminTracker;
     private ServiceRegistration registration;
 
-    public SecuredSessionFactoryImpl(BundleContext bundleContext, ThreadIO threadIO) {
+    public SecuredSessionFactoryImpl(BundleContext bundleContext, ThreadIO threadIO) throws InvalidSyntaxException {
         super(threadIO);
         this.bundleContext = bundleContext;
         this.registration = bundleContext.registerService(ConfigurationListener.class, this, null);
-        this.configAdminTracker = new SingleServiceTracker<ConfigurationAdmin>(bundleContext, ConfigurationAdmin.class, this);
+        this.configAdminTracker = new SingleServiceTracker<>(bundleContext, ConfigurationAdmin.class, this);
         this.configAdminTracker.open();
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/shell/ssh/pom.xml
----------------------------------------------------------------------
diff --git a/shell/ssh/pom.xml b/shell/ssh/pom.xml
index 2c103bf..d297159 100644
--- a/shell/ssh/pom.xml
+++ b/shell/ssh/pom.xml
@@ -103,6 +103,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -115,6 +119,12 @@
                             org.apache.karaf.util.jaas,
                             org.apache.karaf.util.tracker
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>org.apache.karaf.shell.ssh.Activator</Bundle-Activator>
                     </instructions>
                 </configuration>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/Activator.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/Activator.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/Activator.java
index 543ccf4..ac5185d 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/Activator.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/Activator.java
@@ -26,6 +26,9 @@ import org.apache.karaf.shell.api.action.lifecycle.Manager;
 import org.apache.karaf.shell.api.console.Session;
 import org.apache.karaf.shell.api.console.SessionFactory;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.Managed;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
 import org.apache.sshd.SshServer;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.server.command.ScpCommandFactory;
@@ -40,6 +43,10 @@ import org.slf4j.LoggerFactory;
 /**
  * Activate this bundle
  */
+@Services(
+        requires = @RequireService(SessionFactory.class)
+)
+@Managed("org.apache.karaf.shell")
 public class Activator extends BaseActivator implements ManagedService {
 
     static final Logger LOGGER = LoggerFactory.getLogger(Activator.class);
@@ -54,8 +61,8 @@ public class Activator extends BaseActivator implements ManagedService {
     protected void doOpen() throws Exception {
         agentFactory = new KarafAgentFactory();
         sshClientFactory = new SshClientFactory(agentFactory, new File(bundleContext.getProperty("user.home"), ".sshkaraf/known_hosts"));
-        manage("org.apache.karaf.shell");
-        trackService(SessionFactory.class);
+
+        super.doOpen();
 
         sessionTracker = new ServiceTracker<Session, Session>(bundleContext, Session.class, null) {
             @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/system/pom.xml
----------------------------------------------------------------------
diff --git a/system/pom.xml b/system/pom.xml
index 59d338a..8729359 100644
--- a/system/pom.xml
+++ b/system/pom.xml
@@ -85,6 +85,10 @@
         </resources>
         <plugins>
             <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-services-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
@@ -101,6 +105,12 @@
                             org.apache.karaf.util.tracker,
                             org.apache.felix.utils.properties
                         </Private-Package>
+                        <Provide-Capability>
+                            ${capabilities}
+                        </Provide-Capability>
+                        <Require-Capability>
+                            ${requirements}
+                        </Require-Capability>
                         <Bundle-Activator>
                             org.apache.karaf.system.internal.osgi.Activator
                         </Bundle-Activator>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/system/src/main/java/org/apache/karaf/system/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/system/src/main/java/org/apache/karaf/system/internal/osgi/Activator.java b/system/src/main/java/org/apache/karaf/system/internal/osgi/Activator.java
index b7f8eab..3bedd82 100644
--- a/system/src/main/java/org/apache/karaf/system/internal/osgi/Activator.java
+++ b/system/src/main/java/org/apache/karaf/system/internal/osgi/Activator.java
@@ -20,7 +20,10 @@ import org.apache.karaf.system.SystemService;
 import org.apache.karaf.system.internal.SystemServiceImpl;
 import org.apache.karaf.system.management.internal.SystemMBeanImpl;
 import org.apache.karaf.util.tracker.BaseActivator;
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.Services;
 
+@Services(provides = @ProvideService(SystemService.class))
 public class Activator extends BaseActivator {
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/tooling/karaf-services-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/tooling/karaf-services-maven-plugin/pom.xml b/tooling/karaf-services-maven-plugin/pom.xml
new file mode 100644
index 0000000..fc48710
--- /dev/null
+++ b/tooling/karaf-services-maven-plugin/pom.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>tooling</artifactId>
+        <version>4.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>karaf-services-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>Apache Karaf :: Tooling :: Maven Karaf Plugin for Services Metadata</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.sonatype.aether</groupId>
+            <artifactId>aether-api</artifactId>
+            <version>1.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.sonatype.aether</groupId>
+            <artifactId>aether-util</artifactId>
+            <version>1.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.aether</groupId>
+            <artifactId>aether-api</artifactId>
+            <version>0.9.0.M2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.aether</groupId>
+            <artifactId>aether-util</artifactId>
+            <version>0.9.0.M2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-artifact</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-core</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-compat</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.wagon</groupId>
+            <artifactId>wagon-http-lightweight</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.maven.shared</groupId>
+            <artifactId>maven-filtering</artifactId>
+            <version>1.0-beta-4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>plexus-utils</artifactId>
+            <version>3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>maven-bundle-plugin</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.felix</groupId>
+                    <artifactId>org.apache.felix.bundlerepository</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xbean</groupId>
+            <artifactId>xbean-finder-shaded</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <reporting>
+        <!--<outputDirectory>target/site</outputDirectory>-->
+        <plugins>
+            <plugin>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <version>2.9</version>
+            </plugin>
+        </plugins>
+    </reporting>
+
+</project>

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/tooling/karaf-services-maven-plugin/src/main/java/org/apache/karaf/tooling/tracker/GenerateServiceMetadata.java
----------------------------------------------------------------------
diff --git a/tooling/karaf-services-maven-plugin/src/main/java/org/apache/karaf/tooling/tracker/GenerateServiceMetadata.java b/tooling/karaf-services-maven-plugin/src/main/java/org/apache/karaf/tooling/tracker/GenerateServiceMetadata.java
new file mode 100644
index 0000000..bcf5655
--- /dev/null
+++ b/tooling/karaf-services-maven-plugin/src/main/java/org/apache/karaf/tooling/tracker/GenerateServiceMetadata.java
@@ -0,0 +1,148 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.tooling.tracker;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.karaf.util.tracker.ProvideService;
+import org.apache.karaf.util.tracker.RequireService;
+import org.apache.karaf.util.tracker.Services;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
+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.xbean.finder.ClassFinder;
+
+/**
+ * Generates service requirement and capabilities for activators
+ *
+ * @goal service-metadata-generate
+ * @phase process-classes
+ * @execute phase="generate-resources"
+ * @requiresDependencyResolution compile+runtime
+ * @inheritByDefault false
+ * @description Generates service requirement and capabilities for activators
+ */
+public class GenerateServiceMetadata extends AbstractMojo {
+
+    /**
+     * The maven project.
+     *
+     * @parameter default-value="${project}"
+     * @required
+     */
+    protected MavenProject project;
+
+    /**
+     * @parameter default-value="requirements"
+     * @required
+     */
+    protected String requirementsProperty;
+
+    /**
+     * @parameter default-value="capabilities"
+     * @required
+     */
+    protected String capabilitiesProperty;
+
+    /**
+     * The classloader to use for loading the commands.
+     * Can be "project" or "plugin"
+     *
+     * @parameter default-value="project"
+     */
+    protected String classLoader;
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        try {
+            StringBuilder requirements = new StringBuilder();
+            StringBuilder capabilities = new StringBuilder();
+
+            ClassFinder finder = createFinder(classLoader);
+            List<Class<?>> classes = finder.findAnnotatedClasses(Services.class);
+
+            for (Class<?> clazz : classes) {
+                URL classUrl = clazz.getClassLoader().getResource(clazz.getName().replace('.', '/') + ".class");
+                if (classUrl == null || !classUrl.getPath().startsWith(project.getBuild().getOutputDirectory())) {
+                    System.out.println("Ignoring " + classUrl);
+                    continue;
+                }
+                Services services = clazz.getAnnotation(Services.class);
+                if (services != null) {
+                    for (RequireService req : services.requires()) {
+                        String flt = req.filter();
+                        if (flt != null && !flt.isEmpty()) {
+                            flt = "(&(objectClass=" + req.value().getName() + ")" + flt + ")";
+                        } else {
+                            flt = "(objectClass=" + req.value().getName() + ")";
+                        }
+                        if (requirements.length() > 0) {
+                            requirements.append(",");
+                        }
+                        requirements.append("osgi.service;effective:=active;filter:=\"")
+                                    .append(flt)
+                                    .append("\"");
+                    }
+                    for (ProvideService cap : services.provides()) {
+                        if (capabilities.length() > 0) {
+                            capabilities.append(",");
+                        }
+                        capabilities.append("osgi.service;effective:=active;objectClass=")
+                                    .append(cap.value().getName());
+                    }
+                }
+            }
+
+            project.getProperties().setProperty(requirementsProperty, requirements.toString());
+            project.getProperties().setProperty(capabilitiesProperty, capabilities.toString());
+
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error building commands help", e);
+        }
+    }
+
+    private ClassFinder createFinder(String classloaderType) throws Exception {
+        ClassFinder finder;
+        if ("project".equals(classloaderType)) {
+            List<URL> urls = new ArrayList<>();
+
+            urls.add( new File(project.getBuild().getOutputDirectory()).toURI().toURL() );
+            for ( Artifact artifact : project.getArtifacts() ) {
+                File file = artifact.getFile();
+                if ( file != null ) {
+                    urls.add( file.toURI().toURL() );
+                    System.out.println("classpath: " + file);
+                }
+            }
+            ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
+            finder = new ClassFinder(loader, urls);
+        } else if ("plugin".equals(classLoader)) {
+            finder = new ClassFinder(getClass().getClassLoader());
+        } else {
+            throw new MojoFailureException("classLoader attribute must be 'project' or 'plugin'");
+        }
+        return finder;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/karaf/blob/005c0a30/tooling/pom.xml
----------------------------------------------------------------------
diff --git a/tooling/pom.xml b/tooling/pom.xml
index 1437809..317eb8a 100644
--- a/tooling/pom.xml
+++ b/tooling/pom.xml
@@ -34,6 +34,7 @@
     <name>Apache Karaf :: Tooling</name>
 
     <modules>
+        <module>karaf-services-maven-plugin</module>
         <module>karaf-maven-plugin</module>
     </modules>