Thanks for the excellent debugging you have already done and reporting various logs so meticulously.
The issue here is two folds:
a) Problem with JAXP. It is looking up "platform default SchemaFactory" using
thread's context class loader. I consider that a bug, because it need not rely on
caller's context to locate a default class that caller has no idea of. So,
JAXP should use getClass().getClassLoader() to load the platform default factory.
My experience with these problems is that even if we convince them to fix this problem, the
fix does not typically arrive in time. So, we need to work around in our layers.
I will file a bug against them anyway. We have had some success with changing JAXB in the past, so
I will try with JAXP as well.
b) The second problem is with the context class loader that's being used here. If
I see it is org.eclipse.gemini.blueprint.util.BundleDelegatingClassLoader
That class loader seems to be simply delegating to OSGi bundle to load class.
Since bundle  does not depend on any JAXP provider bundle, it can't load that class.
I don't know who sets this class loader as the Thread's context class loader.
Since you say ClusterMapper belongs to a third-party bundle, that basically means
you don't have an interception point to set the context class loader to something like
"system class loader or boot loader" which would have worked.
c) Since the thread is started by gemini blue-print,
is there a configuration provided by it to set the context class loader to something like system?
If yes, you may like to explore that.
d) By adding the package to bootdelegation, it will work, but you see our comment
about why we dislike bootdelegation. It creates problems when you move into an
embedded world where you are no longer in control of framework configuration.
So, we prefer system bundle fragments to export additional packages via system bundle
as described in . You can deploy a system-bundle-fragment to export the additional packages
and then attach a fragment to bundle . Let this second fragment import the package.
That way, you don't have to modify the third-party bundle.