You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2019/10/31 08:47:27 UTC

[karaf] branch karaf-4.2.x updated: [KARAF-6452] Add SCR CXF example

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

jbonofre pushed a commit to branch karaf-4.2.x
in repository https://gitbox.apache.org/repos/asf/karaf.git


The following commit(s) were added to refs/heads/karaf-4.2.x by this push:
     new a68e163  [KARAF-6452] Add SCR CXF example
a68e163 is described below

commit a68e1635496bedc51e4ae2b72dcaee407d326112
Author: Jean-Baptiste Onofré <jb...@apache.org>
AuthorDate: Wed Oct 30 06:01:08 2019 +0100

    [KARAF-6452] Add SCR CXF example
    
    (cherry picked from commit 73bed3ceae64f46e5dbbd2f61711fecf17a7ec3f)
---
 examples/karaf-rest-example/README.md              | 24 +++++++++--
 .../pom.xml                                        |  6 +--
 .../rest/blueprint}/BookingServiceRest.java        |  2 +-
 .../src/main/resources/OSGI-INF/blueprint/rest.xml |  2 +-
 .../src/main/feature/feature.xml                   | 20 ++++++++--
 .../pom.xml                                        | 36 ++++++++++++-----
 .../examples/rest/scr}/BookingServiceRest.java     | 18 +++------
 .../karaf/examples/rest/scr/RestService.java}      | 22 ++++++++---
 examples/karaf-rest-example/pom.xml                |  5 ++-
 examples/karaf-soap-example/README.md              | 11 ++++--
 .../pom.xml                                        | 29 +++++++-------
 .../soap/blueprint}/BookingServiceSoap.java        |  2 +-
 .../soap/blueprint}/BookingServiceSoapImpl.java    |  4 +-
 .../src/main/resources/OSGI-INF/blueprint/soap.xml |  4 +-
 .../karaf-soap-example-client/pom.xml              |  2 +-
 .../karaf/examples/soap/client/CxfClient.java      |  2 +-
 .../src/main/feature/feature.xml                   | 13 +++++-
 .../pom.xml                                        | 46 ++++++++++++++--------
 .../examples/soap/scr}/BookingServiceSoap.java     |  2 +-
 .../examples/soap/scr}/BookingServiceSoapImpl.java |  9 +++--
 .../karaf/examples/soap/scr/SoapService.java}      | 19 ++++++---
 examples/karaf-soap-example/pom.xml                |  3 +-
 .../karaf/itests/examples/RestExampleTest.java     | 30 ++++++++++++--
 .../karaf/itests/examples/SoapExampleTest.java     | 32 +++++++++++++--
 24 files changed, 238 insertions(+), 105 deletions(-)

diff --git a/examples/karaf-rest-example/README.md b/examples/karaf-rest-example/README.md
index 826b55e..93ba30d 100644
--- a/examples/karaf-rest-example/README.md
+++ b/examples/karaf-rest-example/README.md
@@ -1,4 +1,4 @@
-<!--
+    <!--
     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
@@ -31,10 +31,12 @@ The "client" bundle uses the `BookingService` with a REST client stub.
 ## Artifacts
 
 * **karaf-rest-example-api** is a common bundle containing the `Booking` POJO and the `BookingService` interface.   
-* **karaf-rest-example-provider** is a blueprint bundle providing the `BookingServiceRest` implementation of the `BookingService` interface.
+* **karaf-rest-example-blueprint** is a blueprint bundle providing the `BookingServiceRest` implementation of the `BookingService` interface.
+* **karaf-rest-example-scr** is a SCR bundle providing the `BookingServiceRest` implementation of the `BookingService` interface.
 * **karaf-rest-example-client** is a regular Blueprint bundle using the `BookingService`.
 * **karaf-rest-example-client-http** is a regular Blueprint REST client bundle using Java Http.
 * **karaf-rest-example-client-cxf** is a regular Blueprint REST client bundle using Apache CXF.
+* **karaf-rest-example-whiteboard** is another way to deploy REST services using whiteboard pattern.
 * **karaf-rest-example-features** provides a Karaf features repository used for the deployment.
 
 ## Build
@@ -53,10 +55,14 @@ On a running Karaf instance, register the features repository using:
 karaf@root()> feature:repo-add mvn:org.apache.karaf.examples/karaf-rest-example-features/LATEST/xml
 ```
 
-Then, you can install the service provider feature:
+Then, you can install the service blueprint provider or service SCR provider feature:
 
 ```
-karaf@root()> feature:install karaf-rest-example-provider
+karaf@root()> feature:install karaf-rest-example-blueprint
+```
+
+```
+karaf@root()> feature:install karaf-rest-example-scr
 ```
 
 And the service client feature using Java Http:
@@ -83,4 +89,14 @@ service.
 ```
 karaf@root()> booking:add 1 "John Doe" AF520
 karaf@root()> booking:list
+```
+
+## Whiteboard
+
+Instead of the CXF with blueprint `karaf-rest-example-blueprint` feature, or CXF with SCR `karaf-rest-example-scr` feature, you can use the JAXRS Whiteboard approach (with Aries implementation).
+
+Install the `karaf-rest-example-whiteboard` feature:
+
+```
+karaf@root()> feature:install karaf-rest-example-whiteboard
 ```
\ No newline at end of file
diff --git a/examples/karaf-rest-example/karaf-rest-example-provider/pom.xml b/examples/karaf-rest-example/karaf-rest-example-blueprint/pom.xml
similarity index 93%
copy from examples/karaf-rest-example/karaf-rest-example-provider/pom.xml
copy to examples/karaf-rest-example/karaf-rest-example-blueprint/pom.xml
index 787b60e..0c2b0a7 100644
--- a/examples/karaf-rest-example/karaf-rest-example-provider/pom.xml
+++ b/examples/karaf-rest-example/karaf-rest-example-blueprint/pom.xml
@@ -28,8 +28,8 @@
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>karaf-rest-example-provider</artifactId>
-    <name>Apache Karaf :: Examples :: REST :: Provider</name>
+    <artifactId>karaf-rest-example-blueprint</artifactId>
+    <name>Apache Karaf :: Examples :: REST :: Blueprint</name>
     <packaging>bundle</packaging>
 
     <dependencies>
@@ -52,7 +52,7 @@
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
                     <instructions>
-                        <Export-Package>org.apache.karaf.examples.rest.provider</Export-Package>
+                        <Export-Package>org.apache.karaf.examples.rest.blueprint</Export-Package>
                         <Import-Package>
                             *
                         </Import-Package>
diff --git a/examples/karaf-rest-example/karaf-rest-example-provider/src/main/java/org/apache/karaf/examples/rest/provider/BookingServiceRest.java b/examples/karaf-rest-example/karaf-rest-example-blueprint/src/main/java/org/apache/karaf/examples/rest/blueprint/BookingServiceRest.java
similarity index 97%
copy from examples/karaf-rest-example/karaf-rest-example-provider/src/main/java/org/apache/karaf/examples/rest/provider/BookingServiceRest.java
copy to examples/karaf-rest-example/karaf-rest-example-blueprint/src/main/java/org/apache/karaf/examples/rest/blueprint/BookingServiceRest.java
index 097ba2a..ad3f557 100644
--- a/examples/karaf-rest-example/karaf-rest-example-provider/src/main/java/org/apache/karaf/examples/rest/provider/BookingServiceRest.java
+++ b/examples/karaf-rest-example/karaf-rest-example-blueprint/src/main/java/org/apache/karaf/examples/rest/blueprint/BookingServiceRest.java
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.rest.provider;
+package org.apache.karaf.examples.rest.blueprint;
 
 import java.util.Collection;
 import java.util.HashMap;
diff --git a/examples/karaf-rest-example/karaf-rest-example-provider/src/main/resources/OSGI-INF/blueprint/rest.xml b/examples/karaf-rest-example/karaf-rest-example-blueprint/src/main/resources/OSGI-INF/blueprint/rest.xml
similarity index 98%
rename from examples/karaf-rest-example/karaf-rest-example-provider/src/main/resources/OSGI-INF/blueprint/rest.xml
rename to examples/karaf-rest-example/karaf-rest-example-blueprint/src/main/resources/OSGI-INF/blueprint/rest.xml
index 51172b6..d768082 100644
--- a/examples/karaf-rest-example/karaf-rest-example-provider/src/main/resources/OSGI-INF/blueprint/rest.xml
+++ b/examples/karaf-rest-example/karaf-rest-example-blueprint/src/main/resources/OSGI-INF/blueprint/rest.xml
@@ -41,6 +41,6 @@
         </jaxrs:providers>
     </jaxrs:server>
 
-    <bean id="bookingBean" class="org.apache.karaf.examples.rest.provider.BookingServiceRest"/>
+    <bean id="bookingBean" class="org.apache.karaf.examples.rest.blueprint.BookingServiceRest"/>
 
 </blueprint>
diff --git a/examples/karaf-rest-example/karaf-rest-example-features/src/main/feature/feature.xml b/examples/karaf-rest-example/karaf-rest-example-features/src/main/feature/feature.xml
index bad7a67..1122bb3 100644
--- a/examples/karaf-rest-example/karaf-rest-example-features/src/main/feature/feature.xml
+++ b/examples/karaf-rest-example/karaf-rest-example-features/src/main/feature/feature.xml
@@ -25,7 +25,7 @@
         <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-api/${project.version}</bundle>
     </feature>
 
-    <feature name="karaf-rest-example-provider" version="${project.version}">
+    <feature name="karaf-rest-example-blueprint" version="${project.version}">
         <feature version="${project.version}">karaf-rest-example-common</feature>
         <feature dependency="true">http</feature>
         <requirement>osgi.service;effective:=active;filter:=(objectClass=org.osgi.service.http.HttpService)</requirement>
@@ -36,16 +36,14 @@
         <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version}</bundle>
         <bundle dependency="true">mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-base/${jackson.version}</bundle>
         <bundle dependency="true">mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider/${jackson.version}</bundle>
-        <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-provider/${project.version}</bundle>
+        <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-blueprint/${project.version}</bundle>
     </feature>
 
     <feature name="karaf-rest-example-client-http" version="${project.version}">
-        <feature version="${project.version}">karaf-rest-example-provider</feature>
         <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-client-http/${project.version}</bundle>
     </feature>
     
     <feature name="karaf-rest-example-client-cxf" version="${project.version}">
-        <feature version="${project.version}">karaf-rest-example-provider</feature>
         <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-client-cxf/${project.version}</bundle>
     </feature>
 
@@ -59,4 +57,18 @@
         <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-whiteboard/${project.version}</bundle>
     </feature>
 
+    <feature name="karaf-rest-example-scr" version="${project.version}">
+        <feature version="${project.version}">karaf-rest-example-common</feature>
+        <feature dependency="true">http</feature>
+        <requirement>osgi.service;effective:=active;filter:=(objectClass=org.osgi.service.http.HttpService)</requirement>
+        <feature dependency="true">scr</feature>
+        <feature version="${cxf.version}" dependency="true">cxf</feature>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-base/${jackson.version}</bundle>
+        <bundle dependency="true">mvn:com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider/${jackson.version}</bundle>
+        <bundle>mvn:org.apache.karaf.examples/karaf-rest-example-scr/${project.version}</bundle>
+    </feature>
+
 </features>
diff --git a/examples/karaf-rest-example/karaf-rest-example-provider/pom.xml b/examples/karaf-rest-example/karaf-rest-example-scr/pom.xml
similarity index 65%
rename from examples/karaf-rest-example/karaf-rest-example-provider/pom.xml
rename to examples/karaf-rest-example/karaf-rest-example-scr/pom.xml
index 787b60e..1738816 100644
--- a/examples/karaf-rest-example/karaf-rest-example-provider/pom.xml
+++ b/examples/karaf-rest-example/karaf-rest-example-scr/pom.xml
@@ -28,21 +28,34 @@
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>karaf-rest-example-provider</artifactId>
-    <name>Apache Karaf :: Examples :: REST :: Provider</name>
+    <artifactId>karaf-rest-example-scr</artifactId>
+    <name>Apache Karaf :: Examples :: REST :: SCR</name>
     <packaging>bundle</packaging>
 
     <dependencies>
         <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.1</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+            <version>${cxf.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.karaf.examples</groupId>
             <artifactId>karaf-rest-example-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.jaxrs</groupId>
+            <artifactId>jackson-jaxrs-json-provider</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -50,16 +63,19 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
+                <inherited>true</inherited>
+                <extensions>true</extensions>
                 <configuration>
                     <instructions>
-                        <Export-Package>org.apache.karaf.examples.rest.provider</Export-Package>
-                        <Import-Package>
-                            *
-                        </Import-Package>
+                        <Export-Package>!*</Export-Package>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.examples.rest.scr
+                        </Private-Package>
                     </instructions>
                 </configuration>
             </plugin>
         </plugins>
     </build>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/examples/karaf-rest-example/karaf-rest-example-provider/src/main/java/org/apache/karaf/examples/rest/provider/BookingServiceRest.java b/examples/karaf-rest-example/karaf-rest-example-scr/src/main/java/org/apache/karaf/examples/rest/scr/BookingServiceRest.java
similarity index 88%
rename from examples/karaf-rest-example/karaf-rest-example-provider/src/main/java/org/apache/karaf/examples/rest/provider/BookingServiceRest.java
rename to examples/karaf-rest-example/karaf-rest-example-scr/src/main/java/org/apache/karaf/examples/rest/scr/BookingServiceRest.java
index 097ba2a..d8abeaf 100644
--- a/examples/karaf-rest-example/karaf-rest-example-provider/src/main/java/org/apache/karaf/examples/rest/provider/BookingServiceRest.java
+++ b/examples/karaf-rest-example/karaf-rest-example-scr/src/main/java/org/apache/karaf/examples/rest/scr/BookingServiceRest.java
@@ -14,24 +14,16 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.rest.provider;
+package org.apache.karaf.examples.rest.scr;
 
+import org.apache.karaf.examples.rest.api.Booking;
+import org.apache.karaf.examples.rest.api.BookingService;
+
+import javax.ws.rs.*;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-
-import org.apache.karaf.examples.rest.api.Booking;
-import org.apache.karaf.examples.rest.api.BookingService;
-
 @Path("/")
 public class BookingServiceRest implements BookingService {
     
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java b/examples/karaf-rest-example/karaf-rest-example-scr/src/main/java/org/apache/karaf/examples/rest/scr/RestService.java
similarity index 54%
copy from examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
copy to examples/karaf-rest-example/karaf-rest-example-scr/src/main/java/org/apache/karaf/examples/rest/scr/RestService.java
index 63207da..52a5db7 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
+++ b/examples/karaf-rest-example/karaf-rest-example-scr/src/main/java/org/apache/karaf/examples/rest/scr/RestService.java
@@ -14,13 +14,25 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.soap.provider;
+package org.apache.karaf.examples.rest.scr;
 
-import org.apache.karaf.examples.soap.api.BookingService;
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
 
-import javax.jws.WebService;
+@Component
+public class RestService {
 
-@WebService
-public interface BookingServiceSoap extends BookingService {
+    @Activate
+    public void activate() throws Exception {
+        JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
+        bean.setAddress("/booking");
+        bean.setBus(BusFactory.getDefaultBus());
+        bean.setProvider(new JacksonJsonProvider());
+        bean.setServiceBean(new BookingServiceRest());
+        bean.create();
+    }
 
 }
diff --git a/examples/karaf-rest-example/pom.xml b/examples/karaf-rest-example/pom.xml
index 5f184f9..ca87025 100644
--- a/examples/karaf-rest-example/pom.xml
+++ b/examples/karaf-rest-example/pom.xml
@@ -34,10 +34,11 @@
 
     <modules>
         <module>karaf-rest-example-api</module>
-        <module>karaf-rest-example-provider</module>
+        <module>karaf-rest-example-blueprint</module>
+        <module>karaf-rest-example-scr</module>
         <module>karaf-rest-example-client</module>
-        <module>karaf-rest-example-features</module>
         <module>karaf-rest-example-whiteboard</module>
+        <module>karaf-rest-example-features</module>
     </modules>
     
 </project>
diff --git a/examples/karaf-soap-example/README.md b/examples/karaf-soap-example/README.md
index 1fcae2d..f83634d 100644
--- a/examples/karaf-soap-example/README.md
+++ b/examples/karaf-soap-example/README.md
@@ -31,7 +31,8 @@ The "client" bundle uses the `BookingService` with a SOAP client stub.
 ## Artifacts
 
 * **karaf-soap-example-api** is a common bundle containing the `Booking` POJO and the `BookingService` interface.   
-* **karaf-soap-example-provider** is a blueprint bundle providing the `BookingServiceSoap` implementation of the `BookingService` interface.
+* **karaf-soap-example-blueprint** is a blueprint bundle providing the `BookingServiceSoap` implementation of the `BookingService` interface.
+* **karaf-soap-example-scr** is a SCR bundle providing the `BookingServiceSoap` implementation of the `BookingService` interface.
 * **karaf-soap-example-client** is a CXF client to the `BookingService` SOAP.
 * **karaf-soap-example-features** provides a Karaf features repository used for the deployment.
 
@@ -51,10 +52,14 @@ On a running Karaf instance, register the features repository using:
 karaf@root()> feature:repo-add mvn:org.apache.karaf.examples/karaf-soap-example-features/LATEST/xml
 ```
 
-Then, you can install the service provider feature:
+Then, you can install the service blueprint provider or scr provider feature:
 
 ```
-karaf@root()> feature:install karaf-soap-example-provider
+karaf@root()> feature:install karaf-soap-example-blueprint
+```
+
+```
+karaf@root()> feature:install karaf-soap-example-scr
 ```
 
 And the service client feature:
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/pom.xml b/examples/karaf-soap-example/karaf-soap-example-blueprint/pom.xml
similarity index 81%
copy from examples/karaf-soap-example/karaf-soap-example-provider/pom.xml
copy to examples/karaf-soap-example/karaf-soap-example-blueprint/pom.xml
index f473019..49442f5 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/pom.xml
+++ b/examples/karaf-soap-example/karaf-soap-example-blueprint/pom.xml
@@ -28,8 +28,8 @@
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>karaf-soap-example-provider</artifactId>
-    <name>Apache Karaf :: Examples :: SOAP :: Provider</name>
+    <artifactId>karaf-soap-example-blueprint</artifactId>
+    <name>Apache Karaf :: Examples :: SOAP :: Blueprint</name>
     <packaging>bundle</packaging>
 
     <dependencies>
@@ -52,7 +52,7 @@
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
                     <instructions>
-                        <Export-Package>org.apache.karaf.examples.soap.provider</Export-Package>
+                        <Export-Package>org.apache.karaf.examples.soap.blueprint</Export-Package>
                         <Import-Package>
                             *
                         </Import-Package>
@@ -61,20 +61,21 @@
             </plugin>
         </plugins>
     </build>
+
     <profiles>
         <profile>
-	        <id>java9-plus</id>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.apache.geronimo.specs</groupId>
-                        <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
-                        <version>1.1.3</version>
-                    </dependency>
-                </dependencies>
-	        <activation>
-        	    <jdk>[9,)</jdk>
+            <id>java9-plus</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.geronimo.specs</groupId>
+                    <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
+                    <version>1.1.3</version>
+                </dependency>
+            </dependencies>
+            <activation>
+                <jdk>[9,)</jdk>
             </activation>
-	</profile>
+        </profile>
     </profiles>
 
 </project>
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java b/examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/java/org/apache/karaf/examples/soap/blueprint/BookingServiceSoap.java
similarity index 95%
copy from examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
copy to examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/java/org/apache/karaf/examples/soap/blueprint/BookingServiceSoap.java
index 63207da..cb7454c 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
+++ b/examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/java/org/apache/karaf/examples/soap/blueprint/BookingServiceSoap.java
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.soap.provider;
+package org.apache.karaf.examples.soap.blueprint;
 
 import org.apache.karaf.examples.soap.api.BookingService;
 
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoapImpl.java b/examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/java/org/apache/karaf/examples/soap/blueprint/BookingServiceSoapImpl.java
similarity index 89%
copy from examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoapImpl.java
copy to examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/java/org/apache/karaf/examples/soap/blueprint/BookingServiceSoapImpl.java
index eab1304..466dba0 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoapImpl.java
+++ b/examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/java/org/apache/karaf/examples/soap/blueprint/BookingServiceSoapImpl.java
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.soap.provider;
+package org.apache.karaf.examples.soap.blueprint;
 
 import java.util.*;
 
@@ -22,7 +22,7 @@ import org.apache.karaf.examples.soap.api.Booking;
 
 import javax.jws.WebService;
 
-@WebService(endpointInterface="org.apache.karaf.examples.soap.provider.BookingServiceSoap", serviceName="Booking")
+@WebService(endpointInterface="org.apache.karaf.examples.soap.blueprint.BookingServiceSoap", serviceName="Booking")
 public class BookingServiceSoapImpl implements BookingServiceSoap {
 
     private Map<Long, Booking> bookings = new HashMap<>();
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/resources/OSGI-INF/blueprint/soap.xml b/examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/resources/OSGI-INF/blueprint/soap.xml
similarity index 88%
rename from examples/karaf-soap-example/karaf-soap-example-provider/src/main/resources/OSGI-INF/blueprint/soap.xml
rename to examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/resources/OSGI-INF/blueprint/soap.xml
index 50908e5..e3dbc44 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/resources/OSGI-INF/blueprint/soap.xml
+++ b/examples/karaf-soap-example/karaf-soap-example-blueprint/src/main/resources/OSGI-INF/blueprint/soap.xml
@@ -32,9 +32,9 @@
         </cxf:features>
     </cxf:bus>
 
-    <jaxws:server serviceClass="org.apache.karaf.examples.soap.provider.BookingServiceSoap" address="/example">
+    <jaxws:server serviceClass="org.apache.karaf.examples.soap.blueprint.BookingServiceSoap" address="/example">
         <jaxws:serviceBean>
-            <bean class="org.apache.karaf.examples.soap.provider.BookingServiceSoapImpl"/>
+            <bean class="org.apache.karaf.examples.soap.blueprint.BookingServiceSoapImpl"/>
         </jaxws:serviceBean>
     </jaxws:server>
 
diff --git a/examples/karaf-soap-example/karaf-soap-example-client/pom.xml b/examples/karaf-soap-example/karaf-soap-example-client/pom.xml
index 6af147f..afda388 100644
--- a/examples/karaf-soap-example/karaf-soap-example-client/pom.xml
+++ b/examples/karaf-soap-example/karaf-soap-example-client/pom.xml
@@ -40,7 +40,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.karaf.examples</groupId>
-            <artifactId>karaf-soap-example-provider</artifactId>
+            <artifactId>karaf-soap-example-blueprint</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/examples/karaf-soap-example/karaf-soap-example-client/src/main/java/org/apache/karaf/examples/soap/client/CxfClient.java b/examples/karaf-soap-example/karaf-soap-example-client/src/main/java/org/apache/karaf/examples/soap/client/CxfClient.java
index 0df8961..da73d3d 100644
--- a/examples/karaf-soap-example/karaf-soap-example-client/src/main/java/org/apache/karaf/examples/soap/client/CxfClient.java
+++ b/examples/karaf-soap-example/karaf-soap-example-client/src/main/java/org/apache/karaf/examples/soap/client/CxfClient.java
@@ -18,7 +18,7 @@ package org.apache.karaf.examples.soap.client;
 
 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
 import org.apache.karaf.examples.soap.api.Booking;
-import org.apache.karaf.examples.soap.provider.BookingServiceSoap;
+import org.apache.karaf.examples.soap.blueprint.BookingServiceSoap;
 
 import java.util.Collection;
 
diff --git a/examples/karaf-soap-example/karaf-soap-example-features/src/main/feature/feature.xml b/examples/karaf-soap-example/karaf-soap-example-features/src/main/feature/feature.xml
index 53af507..4852d59 100644
--- a/examples/karaf-soap-example/karaf-soap-example-features/src/main/feature/feature.xml
+++ b/examples/karaf-soap-example/karaf-soap-example-features/src/main/feature/feature.xml
@@ -29,13 +29,13 @@
         <bundle dependency="true">mvn:org.ow2.asm/asm-commons/${asm6.version}</bundle>
     </feature>
     
-    <feature name="karaf-soap-example-provider" version="${project.version}">
+    <feature name="karaf-soap-example-blueprint" version="${project.version}">
         <feature>karaf-soap-example-common</feature>
         <feature>aries-blueprint</feature>
         <feature version="${cxf.version}">cxf-core</feature>
         <feature version="${cxf.version}">cxf-jaxws</feature>
         <feature version="${cxf.version}">cxf-databinding-jaxb</feature>
-        <bundle>mvn:org.apache.karaf.examples/karaf-soap-example-provider/${project.version}</bundle>
+        <bundle>mvn:org.apache.karaf.examples/karaf-soap-example-blueprint/${project.version}</bundle>
     </feature>
 
     <feature name="karaf-soap-example-client" version="${project.version}">
@@ -45,4 +45,13 @@
         <bundle>mvn:org.apache.karaf.examples/karaf-soap-example-client/${project.version}</bundle>
     </feature>
 
+    <feature name="karaf-soap-example-scr" version="${project.version}">
+        <feature>karaf-soap-example-common</feature>
+        <feature>scr</feature>
+        <feature version="${cxf.version}">cxf-core</feature>
+        <feature version="${cxf.version}">cxf-jaxws</feature>
+        <feature version="${cxf.version}">cxf-databinding-jaxb</feature>
+        <bundle>mvn:org.apache.karaf.examples/karaf-soap-example-scr/${project.version}</bundle>
+    </feature>
+
 </features>
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/pom.xml b/examples/karaf-soap-example/karaf-soap-example-scr/pom.xml
similarity index 66%
rename from examples/karaf-soap-example/karaf-soap-example-provider/pom.xml
rename to examples/karaf-soap-example/karaf-soap-example-scr/pom.xml
index f473019..d736880 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/pom.xml
+++ b/examples/karaf-soap-example/karaf-soap-example-scr/pom.xml
@@ -28,12 +28,20 @@
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>karaf-soap-example-provider</artifactId>
-    <name>Apache Karaf :: Examples :: SOAP :: Provider</name>
+    <artifactId>karaf-soap-example-scr</artifactId>
+    <name>Apache Karaf :: Examples :: SOAP :: SCR</name>
     <packaging>bundle</packaging>
 
     <dependencies>
         <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.cxf</groupId>
             <artifactId>cxf-rt-frontend-jaxws</artifactId>
             <version>${cxf.version}</version>
@@ -50,31 +58,35 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
+                <inherited>true</inherited>
+                <extensions>true</extensions>
                 <configuration>
                     <instructions>
-                        <Export-Package>org.apache.karaf.examples.soap.provider</Export-Package>
-                        <Import-Package>
-                            *
-                        </Import-Package>
+                        <Export-Package>!*</Export-Package>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.examples.soap.scr
+                        </Private-Package>
                     </instructions>
                 </configuration>
             </plugin>
         </plugins>
     </build>
+
     <profiles>
         <profile>
-	        <id>java9-plus</id>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.apache.geronimo.specs</groupId>
-                        <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
-                        <version>1.1.3</version>
-                    </dependency>
-                </dependencies>
-	        <activation>
-        	    <jdk>[9,)</jdk>
+            <id>java9-plus</id>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.geronimo.specs</groupId>
+                    <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
+                    <version>1.1.3</version>
+                </dependency>
+            </dependencies>
+            <activation>
+                <jdk>[9,)</jdk>
             </activation>
-	</profile>
+        </profile>
     </profiles>
 
 </project>
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java b/examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/BookingServiceSoap.java
similarity index 95%
copy from examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
copy to examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/BookingServiceSoap.java
index 63207da..54fe1f2 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
+++ b/examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/BookingServiceSoap.java
@@ -14,7 +14,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.soap.provider;
+package org.apache.karaf.examples.soap.scr;
 
 import org.apache.karaf.examples.soap.api.BookingService;
 
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoapImpl.java b/examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/BookingServiceSoapImpl.java
similarity index 85%
rename from examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoapImpl.java
rename to examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/BookingServiceSoapImpl.java
index eab1304..0564ad8 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoapImpl.java
+++ b/examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/BookingServiceSoapImpl.java
@@ -14,15 +14,16 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.soap.provider;
-
-import java.util.*;
+package org.apache.karaf.examples.soap.scr;
 
 import org.apache.karaf.examples.soap.api.Booking;
 
 import javax.jws.WebService;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 
-@WebService(endpointInterface="org.apache.karaf.examples.soap.provider.BookingServiceSoap", serviceName="Booking")
+@WebService(endpointInterface="org.apache.karaf.examples.soap.scr.BookingServiceSoap", serviceName="Booking")
 public class BookingServiceSoapImpl implements BookingServiceSoap {
 
     private Map<Long, Booking> bookings = new HashMap<>();
diff --git a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java b/examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/SoapService.java
similarity index 59%
rename from examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
rename to examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/SoapService.java
index 63207da..2e87411 100644
--- a/examples/karaf-soap-example/karaf-soap-example-provider/src/main/java/org/apache/karaf/examples/soap/provider/BookingServiceSoap.java
+++ b/examples/karaf-soap-example/karaf-soap-example-scr/src/main/java/org/apache/karaf/examples/soap/scr/SoapService.java
@@ -14,13 +14,22 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.karaf.examples.soap.provider;
+package org.apache.karaf.examples.soap.scr;
 
-import org.apache.karaf.examples.soap.api.BookingService;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+import org.osgi.service.component.annotations.Component;
 
-import javax.jws.WebService;
+@Component
+public class SoapService {
 
-@WebService
-public interface BookingServiceSoap extends BookingService {
+    public void activate() throws Exception {
+        JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
+        bean.setAddress("/example");
+        bean.setServiceClass(BookingServiceSoap.class);
+        bean.setServiceBean(new BookingServiceSoapImpl());
+        bean.setBus(BusFactory.getDefaultBus());
+        bean.create();
+    }
 
 }
diff --git a/examples/karaf-soap-example/pom.xml b/examples/karaf-soap-example/pom.xml
index 63ab1c3..04bb31e 100644
--- a/examples/karaf-soap-example/pom.xml
+++ b/examples/karaf-soap-example/pom.xml
@@ -34,7 +34,8 @@
 
     <modules>
         <module>karaf-soap-example-api</module>
-        <module>karaf-soap-example-provider</module>
+        <module>karaf-soap-example-blueprint</module>
+        <module>karaf-soap-example-scr</module>
         <module>karaf-soap-example-client</module>
         <module>karaf-soap-example-features</module>
     </modules>
diff --git a/itests/test/src/test/java/org/apache/karaf/itests/examples/RestExampleTest.java b/itests/test/src/test/java/org/apache/karaf/itests/examples/RestExampleTest.java
index b77455f..eacdee6 100644
--- a/itests/test/src/test/java/org/apache/karaf/itests/examples/RestExampleTest.java
+++ b/itests/test/src/test/java/org/apache/karaf/itests/examples/RestExampleTest.java
@@ -51,10 +51,10 @@ public class RestExampleTest extends BaseTest {
     }
 
     @Test
-    public void testWithHttpClient() throws Exception {
+    public void testBlueprintWithHttpClient() throws Exception {
         setup();
 
-        installAndAssertFeature("karaf-rest-example-provider");
+        installAndAssertFeature("karaf-rest-example-blueprint");
 
         installAndAssertFeature("karaf-rest-example-client-http");
 
@@ -62,10 +62,32 @@ public class RestExampleTest extends BaseTest {
     }
 
     @Test
-    public void testWithCxfClient() throws Exception {
+    public void testBlueprintWithCxfClient() throws Exception {
         setup();
 
-        installAndAssertFeature("karaf-rest-example-provider");
+        installAndAssertFeature("karaf-rest-example-blueprint");
+
+        installAndAssertFeature("karaf-rest-example-client-cxf");
+
+        verify();
+    }
+
+    @Test
+    public void testScrWithHttpClient() throws Exception {
+        setup();
+
+        installAndAssertFeature("karaf-rest-example-scr");
+
+        installAndAssertFeature("karaf-rest-example-client-http");
+
+        verify();
+    }
+
+    @Test
+    public void testScrWithCxfClient() throws Exception {
+        setup();
+
+        installAndAssertFeature("karaf-rest-example-scr");
 
         installAndAssertFeature("karaf-rest-example-client-cxf");
 
diff --git a/itests/test/src/test/java/org/apache/karaf/itests/examples/SoapExampleTest.java b/itests/test/src/test/java/org/apache/karaf/itests/examples/SoapExampleTest.java
index 751c6e6..7f34040 100644
--- a/itests/test/src/test/java/org/apache/karaf/itests/examples/SoapExampleTest.java
+++ b/itests/test/src/test/java/org/apache/karaf/itests/examples/SoapExampleTest.java
@@ -21,17 +21,22 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.junit.PaxExam;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
-import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.ops4j.pax.exam.spi.reactors.PerMethod;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
 
 @RunWith(PaxExam.class)
-@ExamReactorStrategy(PerClass.class)
+@ExamReactorStrategy(PerMethod.class)
 public class SoapExampleTest extends BaseTest {
 
     @Test
-    public void test() throws Exception {
+    public void testBlueprint() throws Exception {
         addFeaturesRepository("mvn:org.apache.karaf.examples/karaf-soap-example-features/" + System.getProperty("karaf.version") + "/xml");
 
-        installAndAssertFeature("karaf-soap-example-provider");
+        installAndAssertFeature("karaf-soap-example-blueprint");
         installAndAssertFeature("karaf-soap-example-client");
 
         String url = "http://localhost:" + getHttpPort() + "/cxf/example";
@@ -42,4 +47,23 @@ public class SoapExampleTest extends BaseTest {
         assertContains("TST001", output);
     }
 
+    @Test
+    public void testScr() throws Exception {
+        addFeaturesRepository("mvn:org.apache.karaf.examples/karaf-soap-example-features/" + System.getProperty("karaf.version") + "/xml");
+
+        installAndAssertFeature("karaf-soap-example-scr");
+
+        URL url = new URL("http://localhost:" + getHttpPort() + "/cxf");
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        StringBuilder builder = new StringBuilder();
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                builder.append(line).append("\n");
+            }
+        }
+
+        assertContains("BookingServiceSoap", builder.toString());
+    }
+
 }