On 11/23/10 5:58 PM, Marcel Offermans wrote:
On 23 Nov 2010, at 23:45 , Bram de Kruijff wrote:

On Tue, Nov 23, 2010 at 9:54 PM, Richard S. Hall<[email protected]>  wrote:
On 11/23/10 15:51, Bram de Kruijff wrote:
Hi List,

we are embedding a 3rd party library (in this case Apache Cassandra)
in a bundle . At startup it uses ClassLoader.getSystemClassLoader to
load a resource which fails.

1) Is there a way to intercept this call so that the resource is
loaded from the bundle classpath?
No.
Was afraid you where gonna say that

2) What would the desired patch on Cassandra be. Eg. ContextClassLoader?
Shouldn't it be using its own bundle class loader?
My guess is the Cassandra developers are not "OSGi aware" and we are
just wrapping that library. So in general what best practice pattern
should non OSGi projects follow to be "embedable". a) use their own
this.getClass().getClassLoader(), b) use the ContextClassLoader so we
can switch it c) ...
I general they should allow you to plugin a classloader instead of make 
assumptions that are not overridable.

So whenever they load a class, they should allow you to provide a classloader 
for it. That way, if all classes are on the bundle classpath, you can provide 
the library with your option a). Even if not all classes are on the bundle 
classpath, but somehow provided by some other bundle, this gives you enough 
hooks to attempt to load them on another bundle's classloader (for example when 
trying to deserialize an object graph that had instances that were private to 
several bundles that created those instances but did not share the 
implementation packages).

Agreed, this is the only way. They must provide a hook for the lookup rather than burying it inside and performing it based on assumptions.

Even better if they don't expect to directly use a class at all and instead provide a hook for injecting some instance implementing an interface, then we could just give them the service we want to use rather than them expecting to create their own instance.

-> richard

Option b) I would not recommend, as there is no generic way to associate 
threads with bundles in OSGi, so I would avoid using the context classloader.

Greetings, Marcel


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to