Re: Using an interface between two dl'ed applications

Dennis Reedy <[email protected]> Mon, 19 Jan 2009 12:06:25 -0500
Newsgroups gmane.comp.java.sun.jini
Message-ID <[email protected]>
Before 'C' wants to use 'B', make sure that 'B' is loaded by 'C''s  
context classloader. One way to make this happen is to:

B = new MarshalledObject(B).get();

That way your interface will get loaded correctly

On Jan 19, 2009, at 1119AM, Gregg Wonderly wrote:

> Calum Shaw-Mackay wrote:
>> Given a system 'A' that allows objects 'B' and 'C' to be deployed  
>> to it, where 'C' has an interface dependency on 'B'. Also 'B' and  
>> 'C" are independently deployed, with potentially different  
>> codebases, but with the same interface definition (compiled) in each.
>> When 'C' requests access to 'B' via a dynamic proxy generated from  
>> the Interface declared in 'B's codebase, I get a  
>> ClassNotFoundException, I'm assuming that this is because B's  
>> classes are being declared in a different classloader to 'C's.
>> Is there any way to get around this - any particular usage of  
>> PREFERRED.LIST?
>
> The standard java URLClassLoader (or when you have no  
> PREFERRED.LIST) provides the most often correct handing for  
> interfaces by looking up the classloader chain for resolution before  
> loading locally.
>
> PREFERRED.LIST allows you to say "use my downloaded version always",  
> and in general solves the "class compatibility" issue by allowing a  
> new version of a class to be downloaded and used in preference to  
> the version that might already exist in the classloader tree.
>
> Without more information, I'd suggest that perhaps this is more  
> likely a context class loader issue.  The thread of execution that C  
> was loaded in, is not the same thread of execution that B is loaded  
> in and B's context class loader is used to resolve the interface and  
> it sees the A parent instead of the C context class loader (the  
> PreferredClassLoader that loaded C).
>
> Something like this
>
> A->C->load interface with C classloader
> A->B->load interface with B classloader
>
> So, if the interface is not visible in the "A" class loader, than  
> you must force the path to be A->C->B so that the interface is  
> loaded from C.
>
> Gregg Wonderly
>
> --------------------------------------------------------------------------
> Getting Started:     http://www.jini.org/wiki/Category:Getting_Started
> Community Web Site:  http://jini.org
> jini-users Archive:  http://archives.java.sun.com/archives/jini-users.html
> Unsubscribing:       email "signoff JINI-USERS"  to [email protected]

--------------------------------------------------------------------------
Getting Started:     http://www.jini.org/wiki/Category:Getting_Started
Community Web Site:  http://jini.org
jini-users Archive:  http://archives.java.sun.com/archives/jini-users.html
Unsubscribing:       email "signoff JINI-USERS"  to [email protected]