You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Sergey Beryozkin <sb...@gmail.com> on 2014/12/04 11:08:58 UTC

Re: cxf git commit: [CXF-6131]extract spring-osgi related stuff into an seperate class to avoid possible JVMs failing with some eager resolution class loading exceptions in non-OSGI

Hi Freeman

Thanks, after looking at this code I've realized we can revert the 
changes to CXFActivator too - those classes Spring Osgi deals with are 
only making sense in OSGi so we can further polish the code - I'll play 
a bit later on and let you know about the changes...

Cheers, Sergey
On 04/12/14 08:27, ffang@apache.org wrote:
> Repository: cxf
> Updated Branches:
>    refs/heads/master 2b2f97fe1 -> d50ffd09c
>
>
> [CXF-6131]extract spring-osgi related stuff into an seperate class to avoid possible JVMs failing with some eager resolution class loading exceptions in non-OSGI
>
>
> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/d50ffd09
> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/d50ffd09
> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/d50ffd09
>
> Branch: refs/heads/master
> Commit: d50ffd09c30e606524fb6ed92119d85ccfa13491
> Parents: 2b2f97f
> Author: Freeman Fang <fr...@gmail.com>
> Authored: Thu Dec 4 16:27:32 2014 +0800
> Committer: Freeman Fang <fr...@gmail.com>
> Committed: Thu Dec 4 16:27:32 2014 +0800
>
> ----------------------------------------------------------------------
>   .../cxf/common/util/SpringClasspathScanner.java | 33 ++++++--------
>   .../apache/cxf/common/util/SpringOsgiUtil.java  | 48 ++++++++++++++++++++
>   2 files changed, 63 insertions(+), 18 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/d50ffd09/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> ----------------------------------------------------------------------
> diff --git a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> index de9369e..f36a645 100644
> --- a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> +++ b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
> @@ -30,8 +30,6 @@ import java.util.Map;
>
>   import org.apache.cxf.bus.osgi.CXFActivator;
>   import org.apache.cxf.common.classloader.ClassLoaderUtils;
> -import org.osgi.framework.Bundle;
> -import org.osgi.framework.FrameworkUtil;
>   import org.springframework.core.io.Resource;
>   import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
>   import org.springframework.core.io.support.ResourcePatternResolver;
> @@ -39,17 +37,27 @@ import org.springframework.core.type.AnnotationMetadata;
>   import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
>   import org.springframework.core.type.classreading.MetadataReader;
>   import org.springframework.core.type.classreading.MetadataReaderFactory;
> -import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
> -import org.springframework.osgi.util.BundleDelegatingClassLoader;
>   import org.springframework.util.ClassUtils;
>
>   class SpringClasspathScanner extends ClasspathScanner {
> +
> +    static final SpringOsgiUtil SPRING_OSGI_UTIL;
> +
> +    static {
> +        SpringOsgiUtil springOsgiUtil = null;
> +        try {
> +            springOsgiUtil = new SpringOsgiUtil();
> +        } catch (Throwable ex) {
> +            springOsgiUtil = null;
> +        }
> +        SPRING_OSGI_UTIL = springOsgiUtil;
> +    }
> +
>       SpringClasspathScanner() throws Exception {
>           Class.forName("org.springframework.core.io.support.PathMatchingResourcePatternResolver");
>           Class.forName("org.springframework.core.type.classreading.CachingMetadataReaderFactory");
>       }
>
> -
>       protected Map< Class< ? extends Annotation >, Collection< Class< ? > > > findClassesInternal(
>           Collection< String > basePackages,
>           List<Class< ? extends Annotation > > annotations,
> @@ -161,19 +169,8 @@ class SpringClasspathScanner extends ClasspathScanner {
>       }
>
>       private ResourcePatternResolver getResolver(ClassLoader loader) {
> -        if (CXFActivator.isInOSGi()) {
> -            //in OSGi should use spring-dm OsgiBundleResourcePatternResolver
> -            // which can handle bundle url
> -            Bundle bundle = null;
> -            if (loader == null) {
> -                loader = Thread.currentThread().getContextClassLoader();
> -            }
> -            if (loader instanceof BundleDelegatingClassLoader) {
> -                bundle = ((BundleDelegatingClassLoader)loader).getBundle();
> -            } else {
> -                bundle = FrameworkUtil.getBundle(SpringClasspathScanner.class);
> -            }
> -            return new OsgiBundleResourcePatternResolver(bundle);
> +        if (CXFActivator.isInOSGi() && SPRING_OSGI_UTIL != null) {
> +            return SPRING_OSGI_UTIL.getResolver(loader);
>           } else {
>               return loader != null
>                   ? new PathMatchingResourcePatternResolver(loader) : new PathMatchingResourcePatternResolver();
>
> http://git-wip-us.apache.org/repos/asf/cxf/blob/d50ffd09/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
> ----------------------------------------------------------------------
> diff --git a/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java b/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
> new file mode 100644
> index 0000000..f7b6381
> --- /dev/null
> +++ b/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
> @@ -0,0 +1,48 @@
> +/**
> + * 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.cxf.common.util;
> +
> +import org.osgi.framework.Bundle;
> +import org.osgi.framework.FrameworkUtil;
> +import org.springframework.core.io.support.ResourcePatternResolver;
> +import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
> +import org.springframework.osgi.util.BundleDelegatingClassLoader;
> +
> +public class SpringOsgiUtil {
> +
> +    SpringOsgiUtil() throws Exception {
> +        Class.forName("org.springframework.osgi.io.OsgiBundleResourcePatternResolver");
> +        Class.forName("org.springframework.osgi.util.BundleDelegatingClassLoader");
> +    }
> +
> +    public ResourcePatternResolver getResolver(ClassLoader loader) {
> +        //in OSGi should use spring-dm OsgiBundleResourcePatternResolver
> +        // which can handle bundle url
> +        Bundle bundle = null;
> +        if (loader == null) {
> +            loader = Thread.currentThread().getContextClassLoader();
> +        }
> +        if (loader instanceof BundleDelegatingClassLoader) {
> +            bundle = ((BundleDelegatingClassLoader)loader).getBundle();
> +        } else {
> +            bundle = FrameworkUtil.getBundle(SpringClasspathScanner.class);
> +        }
> +        return new OsgiBundleResourcePatternResolver(bundle);
> +    }
> +}
>


Re: cxf git commit: [CXF-6131]extract spring-osgi related stuff into an seperate class to avoid possible JVMs failing with some eager resolution class loading exceptions in non-OSGI

Posted by Freeman Fang <fr...@gmail.com>.
Thanks Sergey, yeah, it works for most cases.

Just a little bit concern, if users wrongly pull in spring-osgi dependencies even not in OSGi container, cxf will still try to use org.springframework.osgi.io.OsgiBundleResourcePatternResolver which isn't correct.

But with the previous CXFActivator.isInOSGi(), it will only return true if it's really in OSGi container so that the Bundle Activator start() method kick in, it's not only the dependency check, it's the runtime check, so it should be more safe here if we have both.

Just my 2 cents.

Best Regards
-------------
Freeman(Yue) Fang

Red Hat, Inc. 
FuseSource is now part of Red Hat



On 2014-12-4, at 下午7:30, Sergey Beryozkin wrote:

> Have a look please at the latest commit - that should work...
> 
> Cheers, Sergey
> On 04/12/14 10:08, Sergey Beryozkin wrote:
>> Hi Freeman
>> 
>> Thanks, after looking at this code I've realized we can revert the
>> changes to CXFActivator too - those classes Spring Osgi deals with are
>> only making sense in OSGi so we can further polish the code - I'll play
>> a bit later on and let you know about the changes...
>> 
>> Cheers, Sergey
>> On 04/12/14 08:27, ffang@apache.org wrote:
>>> Repository: cxf
>>> Updated Branches:
>>>   refs/heads/master 2b2f97fe1 -> d50ffd09c
>>> 
>>> 
>>> [CXF-6131]extract spring-osgi related stuff into an seperate class to
>>> avoid possible JVMs failing with some eager resolution class loading
>>> exceptions in non-OSGI
>>> 
>>> 
>>> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
>>> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/d50ffd09
>>> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/d50ffd09
>>> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/d50ffd09
>>> 
>>> Branch: refs/heads/master
>>> Commit: d50ffd09c30e606524fb6ed92119d85ccfa13491
>>> Parents: 2b2f97f
>>> Author: Freeman Fang <fr...@gmail.com>
>>> Authored: Thu Dec 4 16:27:32 2014 +0800
>>> Committer: Freeman Fang <fr...@gmail.com>
>>> Committed: Thu Dec 4 16:27:32 2014 +0800
>>> 
>>> ----------------------------------------------------------------------
>>>  .../cxf/common/util/SpringClasspathScanner.java | 33 ++++++--------
>>>  .../apache/cxf/common/util/SpringOsgiUtil.java  | 48
>>> ++++++++++++++++++++
>>>  2 files changed, 63 insertions(+), 18 deletions(-)
>>> ----------------------------------------------------------------------
>>> 
>>> 
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/d50ffd09/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>> 
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>> b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>> 
>>> index de9369e..f36a645 100644
>>> ---
>>> a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>> 
>>> +++
>>> b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>> 
>>> @@ -30,8 +30,6 @@ import java.util.Map;
>>> 
>>>  import org.apache.cxf.bus.osgi.CXFActivator;
>>>  import org.apache.cxf.common.classloader.ClassLoaderUtils;
>>> -import org.osgi.framework.Bundle;
>>> -import org.osgi.framework.FrameworkUtil;
>>>  import org.springframework.core.io.Resource;
>>>  import
>>> org.springframework.core.io.support.PathMatchingResourcePatternResolver;
>>>  import org.springframework.core.io.support.ResourcePatternResolver;
>>> @@ -39,17 +37,27 @@ import
>>> org.springframework.core.type.AnnotationMetadata;
>>>  import
>>> org.springframework.core.type.classreading.CachingMetadataReaderFactory;
>>>  import org.springframework.core.type.classreading.MetadataReader;
>>>  import
>>> org.springframework.core.type.classreading.MetadataReaderFactory;
>>> -import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
>>> -import org.springframework.osgi.util.BundleDelegatingClassLoader;
>>>  import org.springframework.util.ClassUtils;
>>> 
>>>  class SpringClasspathScanner extends ClasspathScanner {
>>> +
>>> +    static final SpringOsgiUtil SPRING_OSGI_UTIL;
>>> +
>>> +    static {
>>> +        SpringOsgiUtil springOsgiUtil = null;
>>> +        try {
>>> +            springOsgiUtil = new SpringOsgiUtil();
>>> +        } catch (Throwable ex) {
>>> +            springOsgiUtil = null;
>>> +        }
>>> +        SPRING_OSGI_UTIL = springOsgiUtil;
>>> +    }
>>> +
>>>      SpringClasspathScanner() throws Exception {
>>> 
>>> Class.forName("org.springframework.core.io.support.PathMatchingResourcePatternResolver");
>>> 
>>> 
>>> Class.forName("org.springframework.core.type.classreading.CachingMetadataReaderFactory");
>>> 
>>>      }
>>> 
>>> -
>>>      protected Map< Class< ? extends Annotation >, Collection< Class<
>>> ? > > > findClassesInternal(
>>>          Collection< String > basePackages,
>>>          List<Class< ? extends Annotation > > annotations,
>>> @@ -161,19 +169,8 @@ class SpringClasspathScanner extends
>>> ClasspathScanner {
>>>      }
>>> 
>>>      private ResourcePatternResolver getResolver(ClassLoader loader) {
>>> -        if (CXFActivator.isInOSGi()) {
>>> -            //in OSGi should use spring-dm
>>> OsgiBundleResourcePatternResolver
>>> -            // which can handle bundle url
>>> -            Bundle bundle = null;
>>> -            if (loader == null) {
>>> -                loader = Thread.currentThread().getContextClassLoader();
>>> -            }
>>> -            if (loader instanceof BundleDelegatingClassLoader) {
>>> -                bundle =
>>> ((BundleDelegatingClassLoader)loader).getBundle();
>>> -            } else {
>>> -                bundle =
>>> FrameworkUtil.getBundle(SpringClasspathScanner.class);
>>> -            }
>>> -            return new OsgiBundleResourcePatternResolver(bundle);
>>> +        if (CXFActivator.isInOSGi() && SPRING_OSGI_UTIL != null) {
>>> +            return SPRING_OSGI_UTIL.getResolver(loader);
>>>          } else {
>>>              return loader != null
>>>                  ? new PathMatchingResourcePatternResolver(loader) :
>>> new PathMatchingResourcePatternResolver();
>>> 
>>> http://git-wip-us.apache.org/repos/asf/cxf/blob/d50ffd09/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>>> 
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>>> b/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>>> new file mode 100644
>>> index 0000000..f7b6381
>>> --- /dev/null
>>> +++ b/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>>> @@ -0,0 +1,48 @@
>>> +/**
>>> + * 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.cxf.common.util;
>>> +
>>> +import org.osgi.framework.Bundle;
>>> +import org.osgi.framework.FrameworkUtil;
>>> +import org.springframework.core.io.support.ResourcePatternResolver;
>>> +import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
>>> +import org.springframework.osgi.util.BundleDelegatingClassLoader;
>>> +
>>> +public class SpringOsgiUtil {
>>> +
>>> +    SpringOsgiUtil() throws Exception {
>>> +
>>> Class.forName("org.springframework.osgi.io.OsgiBundleResourcePatternResolver");
>>> 
>>> +
>>> Class.forName("org.springframework.osgi.util.BundleDelegatingClassLoader");
>>> 
>>> +    }
>>> +
>>> +    public ResourcePatternResolver getResolver(ClassLoader loader) {
>>> +        //in OSGi should use spring-dm OsgiBundleResourcePatternResolver
>>> +        // which can handle bundle url
>>> +        Bundle bundle = null;
>>> +        if (loader == null) {
>>> +            loader = Thread.currentThread().getContextClassLoader();
>>> +        }
>>> +        if (loader instanceof BundleDelegatingClassLoader) {
>>> +            bundle = ((BundleDelegatingClassLoader)loader).getBundle();
>>> +        } else {
>>> +            bundle =
>>> FrameworkUtil.getBundle(SpringClasspathScanner.class);
>>> +        }
>>> +        return new OsgiBundleResourcePatternResolver(bundle);
>>> +    }
>>> +}
>>> 
>> 
> 


Re: cxf git commit: [CXF-6131]extract spring-osgi related stuff into an seperate class to avoid possible JVMs failing with some eager resolution class loading exceptions in non-OSGI

Posted by Sergey Beryozkin <sb...@gmail.com>.
Have a look please at the latest commit - that should work...

Cheers, Sergey
On 04/12/14 10:08, Sergey Beryozkin wrote:
> Hi Freeman
>
> Thanks, after looking at this code I've realized we can revert the
> changes to CXFActivator too - those classes Spring Osgi deals with are
> only making sense in OSGi so we can further polish the code - I'll play
> a bit later on and let you know about the changes...
>
> Cheers, Sergey
> On 04/12/14 08:27, ffang@apache.org wrote:
>> Repository: cxf
>> Updated Branches:
>>    refs/heads/master 2b2f97fe1 -> d50ffd09c
>>
>>
>> [CXF-6131]extract spring-osgi related stuff into an seperate class to
>> avoid possible JVMs failing with some eager resolution class loading
>> exceptions in non-OSGI
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/d50ffd09
>> Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/d50ffd09
>> Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/d50ffd09
>>
>> Branch: refs/heads/master
>> Commit: d50ffd09c30e606524fb6ed92119d85ccfa13491
>> Parents: 2b2f97f
>> Author: Freeman Fang <fr...@gmail.com>
>> Authored: Thu Dec 4 16:27:32 2014 +0800
>> Committer: Freeman Fang <fr...@gmail.com>
>> Committed: Thu Dec 4 16:27:32 2014 +0800
>>
>> ----------------------------------------------------------------------
>>   .../cxf/common/util/SpringClasspathScanner.java | 33 ++++++--------
>>   .../apache/cxf/common/util/SpringOsgiUtil.java  | 48
>> ++++++++++++++++++++
>>   2 files changed, 63 insertions(+), 18 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/d50ffd09/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>
>> ----------------------------------------------------------------------
>> diff --git
>> a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>> b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>
>> index de9369e..f36a645 100644
>> ---
>> a/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>
>> +++
>> b/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
>>
>> @@ -30,8 +30,6 @@ import java.util.Map;
>>
>>   import org.apache.cxf.bus.osgi.CXFActivator;
>>   import org.apache.cxf.common.classloader.ClassLoaderUtils;
>> -import org.osgi.framework.Bundle;
>> -import org.osgi.framework.FrameworkUtil;
>>   import org.springframework.core.io.Resource;
>>   import
>> org.springframework.core.io.support.PathMatchingResourcePatternResolver;
>>   import org.springframework.core.io.support.ResourcePatternResolver;
>> @@ -39,17 +37,27 @@ import
>> org.springframework.core.type.AnnotationMetadata;
>>   import
>> org.springframework.core.type.classreading.CachingMetadataReaderFactory;
>>   import org.springframework.core.type.classreading.MetadataReader;
>>   import
>> org.springframework.core.type.classreading.MetadataReaderFactory;
>> -import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
>> -import org.springframework.osgi.util.BundleDelegatingClassLoader;
>>   import org.springframework.util.ClassUtils;
>>
>>   class SpringClasspathScanner extends ClasspathScanner {
>> +
>> +    static final SpringOsgiUtil SPRING_OSGI_UTIL;
>> +
>> +    static {
>> +        SpringOsgiUtil springOsgiUtil = null;
>> +        try {
>> +            springOsgiUtil = new SpringOsgiUtil();
>> +        } catch (Throwable ex) {
>> +            springOsgiUtil = null;
>> +        }
>> +        SPRING_OSGI_UTIL = springOsgiUtil;
>> +    }
>> +
>>       SpringClasspathScanner() throws Exception {
>>
>> Class.forName("org.springframework.core.io.support.PathMatchingResourcePatternResolver");
>>
>>
>> Class.forName("org.springframework.core.type.classreading.CachingMetadataReaderFactory");
>>
>>       }
>>
>> -
>>       protected Map< Class< ? extends Annotation >, Collection< Class<
>> ? > > > findClassesInternal(
>>           Collection< String > basePackages,
>>           List<Class< ? extends Annotation > > annotations,
>> @@ -161,19 +169,8 @@ class SpringClasspathScanner extends
>> ClasspathScanner {
>>       }
>>
>>       private ResourcePatternResolver getResolver(ClassLoader loader) {
>> -        if (CXFActivator.isInOSGi()) {
>> -            //in OSGi should use spring-dm
>> OsgiBundleResourcePatternResolver
>> -            // which can handle bundle url
>> -            Bundle bundle = null;
>> -            if (loader == null) {
>> -                loader = Thread.currentThread().getContextClassLoader();
>> -            }
>> -            if (loader instanceof BundleDelegatingClassLoader) {
>> -                bundle =
>> ((BundleDelegatingClassLoader)loader).getBundle();
>> -            } else {
>> -                bundle =
>> FrameworkUtil.getBundle(SpringClasspathScanner.class);
>> -            }
>> -            return new OsgiBundleResourcePatternResolver(bundle);
>> +        if (CXFActivator.isInOSGi() && SPRING_OSGI_UTIL != null) {
>> +            return SPRING_OSGI_UTIL.getResolver(loader);
>>           } else {
>>               return loader != null
>>                   ? new PathMatchingResourcePatternResolver(loader) :
>> new PathMatchingResourcePatternResolver();
>>
>> http://git-wip-us.apache.org/repos/asf/cxf/blob/d50ffd09/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>>
>> ----------------------------------------------------------------------
>> diff --git
>> a/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>> b/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>> new file mode 100644
>> index 0000000..f7b6381
>> --- /dev/null
>> +++ b/core/src/main/java/org/apache/cxf/common/util/SpringOsgiUtil.java
>> @@ -0,0 +1,48 @@
>> +/**
>> + * 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.cxf.common.util;
>> +
>> +import org.osgi.framework.Bundle;
>> +import org.osgi.framework.FrameworkUtil;
>> +import org.springframework.core.io.support.ResourcePatternResolver;
>> +import org.springframework.osgi.io.OsgiBundleResourcePatternResolver;
>> +import org.springframework.osgi.util.BundleDelegatingClassLoader;
>> +
>> +public class SpringOsgiUtil {
>> +
>> +    SpringOsgiUtil() throws Exception {
>> +
>> Class.forName("org.springframework.osgi.io.OsgiBundleResourcePatternResolver");
>>
>> +
>> Class.forName("org.springframework.osgi.util.BundleDelegatingClassLoader");
>>
>> +    }
>> +
>> +    public ResourcePatternResolver getResolver(ClassLoader loader) {
>> +        //in OSGi should use spring-dm OsgiBundleResourcePatternResolver
>> +        // which can handle bundle url
>> +        Bundle bundle = null;
>> +        if (loader == null) {
>> +            loader = Thread.currentThread().getContextClassLoader();
>> +        }
>> +        if (loader instanceof BundleDelegatingClassLoader) {
>> +            bundle = ((BundleDelegatingClassLoader)loader).getBundle();
>> +        } else {
>> +            bundle =
>> FrameworkUtil.getBundle(SpringClasspathScanner.class);
>> +        }
>> +        return new OsgiBundleResourcePatternResolver(bundle);
>> +    }
>> +}
>>
>