RFR [JDK8]: 7169894: JAXP Plugability Layer: using service loader

Joe Wang huizhe.wang at oracle.com
Thu Aug 30 18:38:08 UTC 2012


Hi Paul, Alan,

I've read your latest comments.  Before getting back to you on those 
items, I felt it's important we get the classloader handling correctly.  
If it's as what I suspected (as I described in the last email), we may 
have problem with using ServiceLoader.

I've read Paul's explanation, esp. the delegation to 
ClassLoader.getSystemResourceAsStream part.  It looks right as it's 
stated in the spec.  But I do remember it was the issue for CR6723276 
and I did change it to Object.class.getResourceAsStream (without a way 
to call bootstrap classloader).

Just as Paul said, the classloader stuff is quite tricky.  I had three 
dummy jars that I've been running tests with.  I haven't had problems 
loading those jars.  But the tests were under 'normal' conditions, that 
is, the usual jdk classloader hierarchy was followed.

Also, dummy jars may work. But I should at least test Xerces. So that's 
what I'm going to do as well.

--Joe

On 8/30/2012 8:47 AM, Paul Sandoz wrote:
> On Aug 30, 2012, at 8:59 AM, Joe Wang<huizhe.wang at oracle.com>  wrote:
>
>> Alan, Paul,
>>
>> While I was writing a summery as you suggested below, I noticed an issue with using ServiceLoader.  I was trying to use the word 'delegate' but found the ServiceLoader might be doing sth. different than the original jaxp process.
>>
>> Here's the spec:
>> The ServiceLoader.load(service) is equivalent to ServiceLoader.load(service, Thread.currentThread().getContextClassLoader()) where "loader - The class loader to be used to load provider-configuration files and provider classes, or null if the system class loader (or, failing that, the bootstrap class loader) is to be used "
>>
>>
>> Somehow, our earlier discussion concluded that the original process I created, where the context class loader is tried first, if no provider found, bootstrap classloader will be tried next, could be 'delegated' to the ServiceLoader.  But the above didn't really showed that. When I looked at the code, it actually simply returns false if loader.getResources fails to find a provider.
> The CL.getResources will also delegate to the parent CL if one is present which should eventually get to the bootstrap CL.
>
>
>>   Also, it calls ClassLoader.getSystemResources when loader=null.  The later would be a regression to CR6723276 if we had called ServiceLoader.load(service, loader) with loader=null.
>>
>
> Seems as OK as i said in the previous email, since Object.class.getResourceAsStream does:
>
>       public InputStream getResourceAsStream(String name) {
>          name = resolveName(name);
>          ClassLoader cl = getClassLoader0(); //<--- This will be null for Object.class
>          if (cl==null) {
>              // A system class.
>              return ClassLoader.getSystemResourceAsStream(name);  //<--- Look!
>          }
>          return cl.getResourceAsStream(name);
>      }
>
> This area is complicated i think you need to write some SL tests.
>
> Paul.



More information about the core-libs-dev mailing list