On Jun 20, 2011, at 11:01 PM, Scott Marlow wrote:
On 06/17/2011 07:22 AM, Steve Ebersole wrote:
> I remember Scott and I discussing this exact issue. Unfortunately I do
> not remember the specifics. java.util.ServiceLoader#load(Class<S>
> service) does use the TCCL, but I think that the end result of our
> discussion was this is ok.
> We need to have this call be able to locate services both within the
> module classloader as well as within the classloader that ikncludes the
> user app. Scott, is there a single classloader that covers both of those
> cases that we could use?
Basically, we need to inject any needed modules into the application.
> On 06/16/2011 06:54 AM, Strong Liu wrote:
>> Hi there,
>> first of all, I have finished this task, and test pass.
>> but :), i have to make the following changes, i'd like to hear you
>> guys' thoughts before i go to much away.
>> 1. adding envers into org.hibernate module in as7, so user's app can
>> see both hibernate and envers class
>> (with an separate envers module i ran into some cycle dependency issue)
Well, I forget what you did exactly Strong, but the above statement (1) sounds wrong. It
may be true but what you stated would not give the app classloader, access to the envers
module. Adding envers into the org.hibernate module, means that Hibernate code can load
the envers classes.
Did you get a circular dependency error message? Or are you just trying to design around
with adding envers into a separate module, we have two options:
1) core module depends on envers module
so, the Integrator can find envers, but envers also need core's classes, so i got
class not found error for SessionFactory when building envers objects.
2) envers module depends on core
the integrator won't work, since core can't see envers' resource, so i got
"listeners were not registed" exception
this is what i called "circular dependency"
and adding envers into org.hibernate module, means there will no org.hibernate.envers
module, and a (jpa) app's classloader can access org.hibernate module, right? so it
can access envers class too.
>> 2. envers throws "listeners were not registed" exception, means
>> hibernate's IntegratorServiceImpl can't see envers class/resource
>> IntegratorServiceImpl is using java.util.ServiceLoader#load(Class<S>
>> service), which internally using TCCL, (I think)
>> that's the reason why core can't see envers' integrator.
>> so, i created a custom ServiceLoader which use ClassLoaderService to
>> find the integrator, but this doesn't work either.
>> since, we need
>> first (META-INF/services/org.hibernate.integrator.spi.Integrator) and
>> ClassLoaderServiceImpl using resourceClassLoader to do this.
>> by default, resourceClassLoader is set to applicationClassLoader in
>> then, i changed IntegratorServiceImpl to use
>> java.util.ServiceLoader#load(Class<S> service,
>> ), test pass, but this of course is not the fix.
>> so, i changed the custom ServiceLoader to use classLoaderService to
>> locateResources first, and using ServiceLoader.class.getClassLoader()
>> to reload the resource again.
>> here are the changes:
>> Strong Liu<stliu(a)hibernate.org>