[jboss-as7-dev] [Discuss] Making Shrinkwrap more module-classloader friendly

Thomas Diesler thomas.diesler at jboss.com
Fri Dec 10 06:28:31 EST 2010


I think SW should work as a utility, not as a service. The client needs 
to have the appropriate dependencies setup. If you don't want a direct 
dependency on the SW impl you could re-export that from a SW wrapper module

org.jboss.shrinkwrap
     +- org.jboss.shrinkwrap.api;export=true
     +- org.jboss.shrinkwrap.impl;export=true
     +- org.jboss.shrinkwrap.spi;export=true


Clients would than only need to have a dependency on org.jboss.shrinkwrap
The usage of TCCL in SW is questionable in the first place. SW should 
work as a utility in the class loading context of the caller IMHO.

Also, there seem to be two separate issues

#1 SW initialization
#2 SW usage

The obvious client for SW in AS are ARQ test cases, so perhaps #1 can be 
done as part of the Aquillian subsystem startup. For #2 to work, test 
modules would need to have a dependency on org.jboss.shrinkwrap

cheers
-thomas

On 12/10/2010 11:17 AM, David Bosschaert wrote:
> Hi all,
>
> I have been looking at getting Shrinkwrap to work in a module-based
> environment, like OSGi and JBoss Modules. I ran into issues with this
> basically because the interaction goes through the ShrinkWrap-API module
> and some static methods in there while the implementation requires that
> the ThreadContextClassLoader has visibility of Shrinkwrap-Impl module.
>
> In a classloader setting where all the SW jars are visible to the same
> classloader this works fine, but in a modules-based system these two
> modules would be loaded by two different classloaders so the only way to
> get the current approach work is to set the TCCL explicitly to the
> classloader that loads the ShrinkWrap-Impl module, which is a little
> awkward to do but also typically requires a dependency on a
> ShrinkWrap-Impl class which is ugly (IMHO), e.g:
>     ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
>     try {
>       Thread.currentThread().setContextClassLoader(
>         JavaArchiveImpl.class.getClassloader()); // The impl class
>       Archive a = ShrinkWrap.create(...);
>     } finally {
>       Thread.currentThread().setContextClassLoader(oldCL);
>     }
>
> I can see two solutions to this.
>
> 1. The nicest one (IMHO) would be to let the impl module register a
> ShrinkWrap service (with MSC and/or OSGi) which handles all the TCCL
> details. The nice thing is that the user doesn't need to get into any SW
> implementation detail. Just use the service and it works - the API of
> the service would be similar to the ShrinkWrap class that's there today
> and defined in the API module. I guess the disadvantage would be that
> you need to obtain the service instance from the service registry, so
> you can't use a static API like ShrinkWrap.create().
>
> 2. An alternative could be to add additional static ShrinkWrap.create()
> (etc) methods that take a classloader as an argument. You would then
> still need to get hold of that classloader somehow, but at least you're
> freed of the TCCL setter wrapping code...
>
> Thoughts anyone?
>
> David
>
> BTW more context can be found in
> https://jira.jboss.org/browse/SHRINKWRAP-242 where I'm providing an
> initial proposal for #1 above to work in OSGi.
> _______________________________________________
> jboss-as7-dev mailing list
> jboss-as7-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jboss-as7-dev

-- 
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Thomas Diesler
JBoss OSGi Lead
JBoss, a division of Red Hat
xxxxxxxxxxxxxxxxxxxxxxxxxxxx




More information about the jboss-as7-dev mailing list