You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by Jamie McCrindle <ja...@gmail.com> on 2006/09/28 11:22:03 UTC

spring and classloading

hi all,

this isn't a bug or issue, just a question if someone has solved a
similar problem or info for someone who has a similar problem.

i switched to putting a spring xml config into my component and
configuring it from there (mainly because i'm using hibernate and i
wanted to use the spring transaction management which seems a lot
easier using a spring beans configuration rather than hand cranking
it).

unit testing went well, but i ran into all sorts of classloading
issues when deploying the component. essentially, it looks like if i
load spring from servicemix, it can't see classes loaded by the
component. this looks to be a reflection problem:

Caused by: java.lang.NoClassDefFoundError: org/hibernate/HibernateException
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:242)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:160)
        at org.springframework.beans.factory.support.AbstractBeanDefinition.reso
lveBeanClass(AbstractBeanDefinition.java:308)

using either:

context.setClassLoader(getClass().getClassLoader());

or

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

doesn't seem to make a difference.

if i switch to self-first and put the spring jar into the component, i
need to add a bunch of other jars in that are part of the default
servicemix lib (e.g. xbean, activemq, exclude xml-api's, derby). these
are all jars that the component uses so it might not be a bad thing
from a jbi container portability point of view BUT because i'm using
hibernate, i need an easy way to allow people to dump new database
drivers into servicemix and it would be preferable if they could put
them into the servicemix/lib folder rather than either creating a
shared library component or rebuilding my component with them in.

my current plan is to rip out the spring-beans config and hand crank
it (which i prefer in all honesty but is going to be a bit of a PITA).

cheers,
j.

Re: spring and classloading

Posted by Jamie McCrindle <ja...@gmail.com>.
Yup, HibernateException is loaded from spring. Putting spring into the
component is definitely preferable to putting hibernate into the
container :)

cheers,
j.

On 9/29/06, Guillaume Nodet <gn...@gmail.com> wrote:
> If HibernateException is loaded from spring (and I guess it is),
> you have no way to work around that, but to put spring
> in your component, or put hibernate in the container classpath :(
>
> On 9/29/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > Hi Guilaume,
> >
> > I stopped using spring configuration and instead wired the objects
> > together in Java. When loading LocalSessionFactoryBean loaded from the
> > container classloader, it couldn't see HibernateException loaded by
> > the component classloader.
> >
> > I used:
> >
> > Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
> >
> > to set the classloader.
> >
> > cheers,
> > j.
> >
> > On 9/29/06, Guillaume Nodet <gn...@gmail.com> wrote:
> > > How do you load your spring configuration ?
> > > You need to set up the thread context classloader
> > > correctly in order to load beans defined in your
> > > component, but you do not have to embed
> > > spring, as it is already available in the container
> > > classloader.
> > >
> > > On 9/29/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > > > right. changed all of the xml config into plain old java and still
> > > > faced essentially the same problem. it turns out, though, that it's
> > > > more to do with the difference in classloading between running
> > > > servicemix as a maven goal (i.e. mvn:servicemix) rather than deploying
> > > > into a running servicemix (mvn:projectDeploy). I still need to include
> > > > spring in component but it looks like it can pick up the derby drivers
> > > > from servicemix which means someone could drop oracle drivers in there
> > > > if they like.
> > > >
> > > > cheers,
> > > > j.
> > > >
> > > > On 9/28/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > > > > hi all,
> > > > >
> > > > > this isn't a bug or issue, just a question if someone has solved a
> > > > > similar problem or info for someone who has a similar problem.
> > > > >
> > > > > i switched to putting a spring xml config into my component and
> > > > > configuring it from there (mainly because i'm using hibernate and i
> > > > > wanted to use the spring transaction management which seems a lot
> > > > > easier using a spring beans configuration rather than hand cranking
> > > > > it).
> > > > >
> > > > > unit testing went well, but i ran into all sorts of classloading
> > > > > issues when deploying the component. essentially, it looks like if i
> > > > > load spring from servicemix, it can't see classes loaded by the
> > > > > component. this looks to be a reflection problem:
> > > > >
> > > > > Caused by: java.lang.NoClassDefFoundError: org/hibernate/HibernateException
> > > > >         at java.lang.Class.forName0(Native Method)
> > > > >         at java.lang.Class.forName(Class.java:242)
> > > > >         at org.springframework.util.ClassUtils.forName(ClassUtils.java:160)
> > > > >         at org.springframework.beans.factory.support.AbstractBeanDefinition.reso
> > > > > lveBeanClass(AbstractBeanDefinition.java:308)
> > > > >
> > > > > using either:
> > > > >
> > > > > context.setClassLoader(getClass().getClassLoader());
> > > > >
> > > > > or
> > > > >
> > > > > Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
> > > > >
> > > > > doesn't seem to make a difference.
> > > > >
> > > > > if i switch to self-first and put the spring jar into the component, i
> > > > > need to add a bunch of other jars in that are part of the default
> > > > > servicemix lib (e.g. xbean, activemq, exclude xml-api's, derby). these
> > > > > are all jars that the component uses so it might not be a bad thing
> > > > > from a jbi container portability point of view BUT because i'm using
> > > > > hibernate, i need an easy way to allow people to dump new database
> > > > > drivers into servicemix and it would be preferable if they could put
> > > > > them into the servicemix/lib folder rather than either creating a
> > > > > shared library component or rebuilding my component with them in.
> > > > >
> > > > > my current plan is to rip out the spring-beans config and hand crank
> > > > > it (which i prefer in all honesty but is going to be a bit of a PITA).
> > > > >
> > > > > cheers,
> > > > > j.
> > > > >
> > > >
> > >
> > >
> > > --
> > > Cheers,
> > > Guillaume Nodet
> > >
> >
>
>
> --
> Cheers,
> Guillaume Nodet
>

Re: spring and classloading

Posted by Guillaume Nodet <gn...@gmail.com>.
If HibernateException is loaded from spring (and I guess it is),
you have no way to work around that, but to put spring
in your component, or put hibernate in the container classpath :(

On 9/29/06, Jamie McCrindle <ja...@gmail.com> wrote:
> Hi Guilaume,
>
> I stopped using spring configuration and instead wired the objects
> together in Java. When loading LocalSessionFactoryBean loaded from the
> container classloader, it couldn't see HibernateException loaded by
> the component classloader.
>
> I used:
>
> Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
>
> to set the classloader.
>
> cheers,
> j.
>
> On 9/29/06, Guillaume Nodet <gn...@gmail.com> wrote:
> > How do you load your spring configuration ?
> > You need to set up the thread context classloader
> > correctly in order to load beans defined in your
> > component, but you do not have to embed
> > spring, as it is already available in the container
> > classloader.
> >
> > On 9/29/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > > right. changed all of the xml config into plain old java and still
> > > faced essentially the same problem. it turns out, though, that it's
> > > more to do with the difference in classloading between running
> > > servicemix as a maven goal (i.e. mvn:servicemix) rather than deploying
> > > into a running servicemix (mvn:projectDeploy). I still need to include
> > > spring in component but it looks like it can pick up the derby drivers
> > > from servicemix which means someone could drop oracle drivers in there
> > > if they like.
> > >
> > > cheers,
> > > j.
> > >
> > > On 9/28/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > > > hi all,
> > > >
> > > > this isn't a bug or issue, just a question if someone has solved a
> > > > similar problem or info for someone who has a similar problem.
> > > >
> > > > i switched to putting a spring xml config into my component and
> > > > configuring it from there (mainly because i'm using hibernate and i
> > > > wanted to use the spring transaction management which seems a lot
> > > > easier using a spring beans configuration rather than hand cranking
> > > > it).
> > > >
> > > > unit testing went well, but i ran into all sorts of classloading
> > > > issues when deploying the component. essentially, it looks like if i
> > > > load spring from servicemix, it can't see classes loaded by the
> > > > component. this looks to be a reflection problem:
> > > >
> > > > Caused by: java.lang.NoClassDefFoundError: org/hibernate/HibernateException
> > > >         at java.lang.Class.forName0(Native Method)
> > > >         at java.lang.Class.forName(Class.java:242)
> > > >         at org.springframework.util.ClassUtils.forName(ClassUtils.java:160)
> > > >         at org.springframework.beans.factory.support.AbstractBeanDefinition.reso
> > > > lveBeanClass(AbstractBeanDefinition.java:308)
> > > >
> > > > using either:
> > > >
> > > > context.setClassLoader(getClass().getClassLoader());
> > > >
> > > > or
> > > >
> > > > Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
> > > >
> > > > doesn't seem to make a difference.
> > > >
> > > > if i switch to self-first and put the spring jar into the component, i
> > > > need to add a bunch of other jars in that are part of the default
> > > > servicemix lib (e.g. xbean, activemq, exclude xml-api's, derby). these
> > > > are all jars that the component uses so it might not be a bad thing
> > > > from a jbi container portability point of view BUT because i'm using
> > > > hibernate, i need an easy way to allow people to dump new database
> > > > drivers into servicemix and it would be preferable if they could put
> > > > them into the servicemix/lib folder rather than either creating a
> > > > shared library component or rebuilding my component with them in.
> > > >
> > > > my current plan is to rip out the spring-beans config and hand crank
> > > > it (which i prefer in all honesty but is going to be a bit of a PITA).
> > > >
> > > > cheers,
> > > > j.
> > > >
> > >
> >
> >
> > --
> > Cheers,
> > Guillaume Nodet
> >
>


-- 
Cheers,
Guillaume Nodet

Re: spring and classloading

Posted by Jamie McCrindle <ja...@gmail.com>.
Hi Guilaume,

I stopped using spring configuration and instead wired the objects
together in Java. When loading LocalSessionFactoryBean loaded from the
container classloader, it couldn't see HibernateException loaded by
the component classloader.

I used:

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

to set the classloader.

cheers,
j.

On 9/29/06, Guillaume Nodet <gn...@gmail.com> wrote:
> How do you load your spring configuration ?
> You need to set up the thread context classloader
> correctly in order to load beans defined in your
> component, but you do not have to embed
> spring, as it is already available in the container
> classloader.
>
> On 9/29/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > right. changed all of the xml config into plain old java and still
> > faced essentially the same problem. it turns out, though, that it's
> > more to do with the difference in classloading between running
> > servicemix as a maven goal (i.e. mvn:servicemix) rather than deploying
> > into a running servicemix (mvn:projectDeploy). I still need to include
> > spring in component but it looks like it can pick up the derby drivers
> > from servicemix which means someone could drop oracle drivers in there
> > if they like.
> >
> > cheers,
> > j.
> >
> > On 9/28/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > > hi all,
> > >
> > > this isn't a bug or issue, just a question if someone has solved a
> > > similar problem or info for someone who has a similar problem.
> > >
> > > i switched to putting a spring xml config into my component and
> > > configuring it from there (mainly because i'm using hibernate and i
> > > wanted to use the spring transaction management which seems a lot
> > > easier using a spring beans configuration rather than hand cranking
> > > it).
> > >
> > > unit testing went well, but i ran into all sorts of classloading
> > > issues when deploying the component. essentially, it looks like if i
> > > load spring from servicemix, it can't see classes loaded by the
> > > component. this looks to be a reflection problem:
> > >
> > > Caused by: java.lang.NoClassDefFoundError: org/hibernate/HibernateException
> > >         at java.lang.Class.forName0(Native Method)
> > >         at java.lang.Class.forName(Class.java:242)
> > >         at org.springframework.util.ClassUtils.forName(ClassUtils.java:160)
> > >         at org.springframework.beans.factory.support.AbstractBeanDefinition.reso
> > > lveBeanClass(AbstractBeanDefinition.java:308)
> > >
> > > using either:
> > >
> > > context.setClassLoader(getClass().getClassLoader());
> > >
> > > or
> > >
> > > Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
> > >
> > > doesn't seem to make a difference.
> > >
> > > if i switch to self-first and put the spring jar into the component, i
> > > need to add a bunch of other jars in that are part of the default
> > > servicemix lib (e.g. xbean, activemq, exclude xml-api's, derby). these
> > > are all jars that the component uses so it might not be a bad thing
> > > from a jbi container portability point of view BUT because i'm using
> > > hibernate, i need an easy way to allow people to dump new database
> > > drivers into servicemix and it would be preferable if they could put
> > > them into the servicemix/lib folder rather than either creating a
> > > shared library component or rebuilding my component with them in.
> > >
> > > my current plan is to rip out the spring-beans config and hand crank
> > > it (which i prefer in all honesty but is going to be a bit of a PITA).
> > >
> > > cheers,
> > > j.
> > >
> >
>
>
> --
> Cheers,
> Guillaume Nodet
>

Re: spring and classloading

Posted by Guillaume Nodet <gn...@gmail.com>.
How do you load your spring configuration ?
You need to set up the thread context classloader
correctly in order to load beans defined in your
component, but you do not have to embed
spring, as it is already available in the container
classloader.

On 9/29/06, Jamie McCrindle <ja...@gmail.com> wrote:
> right. changed all of the xml config into plain old java and still
> faced essentially the same problem. it turns out, though, that it's
> more to do with the difference in classloading between running
> servicemix as a maven goal (i.e. mvn:servicemix) rather than deploying
> into a running servicemix (mvn:projectDeploy). I still need to include
> spring in component but it looks like it can pick up the derby drivers
> from servicemix which means someone could drop oracle drivers in there
> if they like.
>
> cheers,
> j.
>
> On 9/28/06, Jamie McCrindle <ja...@gmail.com> wrote:
> > hi all,
> >
> > this isn't a bug or issue, just a question if someone has solved a
> > similar problem or info for someone who has a similar problem.
> >
> > i switched to putting a spring xml config into my component and
> > configuring it from there (mainly because i'm using hibernate and i
> > wanted to use the spring transaction management which seems a lot
> > easier using a spring beans configuration rather than hand cranking
> > it).
> >
> > unit testing went well, but i ran into all sorts of classloading
> > issues when deploying the component. essentially, it looks like if i
> > load spring from servicemix, it can't see classes loaded by the
> > component. this looks to be a reflection problem:
> >
> > Caused by: java.lang.NoClassDefFoundError: org/hibernate/HibernateException
> >         at java.lang.Class.forName0(Native Method)
> >         at java.lang.Class.forName(Class.java:242)
> >         at org.springframework.util.ClassUtils.forName(ClassUtils.java:160)
> >         at org.springframework.beans.factory.support.AbstractBeanDefinition.reso
> > lveBeanClass(AbstractBeanDefinition.java:308)
> >
> > using either:
> >
> > context.setClassLoader(getClass().getClassLoader());
> >
> > or
> >
> > Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
> >
> > doesn't seem to make a difference.
> >
> > if i switch to self-first and put the spring jar into the component, i
> > need to add a bunch of other jars in that are part of the default
> > servicemix lib (e.g. xbean, activemq, exclude xml-api's, derby). these
> > are all jars that the component uses so it might not be a bad thing
> > from a jbi container portability point of view BUT because i'm using
> > hibernate, i need an easy way to allow people to dump new database
> > drivers into servicemix and it would be preferable if they could put
> > them into the servicemix/lib folder rather than either creating a
> > shared library component or rebuilding my component with them in.
> >
> > my current plan is to rip out the spring-beans config and hand crank
> > it (which i prefer in all honesty but is going to be a bit of a PITA).
> >
> > cheers,
> > j.
> >
>


-- 
Cheers,
Guillaume Nodet

Re: spring and classloading

Posted by Jamie McCrindle <ja...@gmail.com>.
right. changed all of the xml config into plain old java and still
faced essentially the same problem. it turns out, though, that it's
more to do with the difference in classloading between running
servicemix as a maven goal (i.e. mvn:servicemix) rather than deploying
into a running servicemix (mvn:projectDeploy). I still need to include
spring in component but it looks like it can pick up the derby drivers
from servicemix which means someone could drop oracle drivers in there
if they like.

cheers,
j.

On 9/28/06, Jamie McCrindle <ja...@gmail.com> wrote:
> hi all,
>
> this isn't a bug or issue, just a question if someone has solved a
> similar problem or info for someone who has a similar problem.
>
> i switched to putting a spring xml config into my component and
> configuring it from there (mainly because i'm using hibernate and i
> wanted to use the spring transaction management which seems a lot
> easier using a spring beans configuration rather than hand cranking
> it).
>
> unit testing went well, but i ran into all sorts of classloading
> issues when deploying the component. essentially, it looks like if i
> load spring from servicemix, it can't see classes loaded by the
> component. this looks to be a reflection problem:
>
> Caused by: java.lang.NoClassDefFoundError: org/hibernate/HibernateException
>         at java.lang.Class.forName0(Native Method)
>         at java.lang.Class.forName(Class.java:242)
>         at org.springframework.util.ClassUtils.forName(ClassUtils.java:160)
>         at org.springframework.beans.factory.support.AbstractBeanDefinition.reso
> lveBeanClass(AbstractBeanDefinition.java:308)
>
> using either:
>
> context.setClassLoader(getClass().getClassLoader());
>
> or
>
> Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
>
> doesn't seem to make a difference.
>
> if i switch to self-first and put the spring jar into the component, i
> need to add a bunch of other jars in that are part of the default
> servicemix lib (e.g. xbean, activemq, exclude xml-api's, derby). these
> are all jars that the component uses so it might not be a bad thing
> from a jbi container portability point of view BUT because i'm using
> hibernate, i need an easy way to allow people to dump new database
> drivers into servicemix and it would be preferable if they could put
> them into the servicemix/lib folder rather than either creating a
> shared library component or rebuilding my component with them in.
>
> my current plan is to rip out the spring-beans config and hand crank
> it (which i prefer in all honesty but is going to be a bit of a PITA).
>
> cheers,
> j.
>