FELIX-4713 - Change how interface are loaded when checking the provided services (interfaces).

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1642973 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index 93628eb..8e3a88f 100644
--- a/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/runtime/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -289,12 +289,14 @@
      * @throws ConfigurationException : the checked provided service is not correct.
      */
     private boolean checkProvidedService(ProvidedService svc) throws ConfigurationException {
+        Set<ClassLoader> classloaders = new LinkedHashSet<ClassLoader>();
         for (int i = 0; i < svc.getServiceSpecifications().length; i++) {
             String specName = svc.getServiceSpecifications()[i];
 
             // Check service level dependencies
             try {
-                Class spec = getInstanceManager().getFactory().loadClass(specName);
+                Class spec = load(specName, classloaders);
+                classloaders.add(spec.getClassLoader());
                 Field specField = spec.getField("specification");
                 Object specif = specField.get(null);
                 if (specif instanceof String) {
@@ -327,6 +329,22 @@
         return true;
     }
 
+    private Class load(String specName, Set<ClassLoader> classloaders) throws ClassNotFoundException {
+        try {
+            return getInstanceManager().getFactory().loadClass(specName);
+        } catch (ClassNotFoundException e) {
+            // Try collected classloaders.
+        }
+        for (ClassLoader cl : classloaders) {
+            try {
+                return cl.loadClass(specName);
+            } catch (ClassNotFoundException e) {
+                // Try next one.
+            }
+        }
+        throw new ClassNotFoundException(specName);
+    }
+
     /**
      * Look for the implementation (i.e. component) dependency for the given service-level requirement metadata.
      * @param element : the service-level requirement metadata