You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Ravi Krishnamurthy <ra...@savvion.com> on 2005/10/24 19:20:29 UTC

classLoaders

Hello:
I have a custom classloader that has the ejbclassloader as the parent. 
The custom classloader loads all the ibatis classes but the thread 
context classloader is the ejbclassloader. So when the ibatis is trying 
to load the resource, I get resource not found for the sql...dtd files. 
On lookig at the source code looks like in the Resources.java of ibatis, 
the getClassLoader first check the default Classloader and then the 
Thread.contextClassloader. Looks like in my case, the defaultClassLoader 
is null and so the context classloader (ejbclassloader) is used to 
search for the resources and so things file.

Could someone give me some pointers on how to resolve this problem.

But wondering why the getClassLoader does not use the classloader that 
loaded the Resources.java to search for the resources.

Please note that the ibatis classes are only visible to the 
cutomclassloader and not to the ejbclassloader.

Thanks for your time,

Regards,
Ravi


Re: classLoaders

Posted by Ravi Krishnamurthy <ra...@savvion.com>.
Thanks Larry. Actually I ahve tried 
Resources.setDefaultClassLoaders(customClassLoader) and it worked fine. 
But it forces the clients to call this everytime which I wish to handle 
without forcing the clients to do anything. It is little bit tricky to 
do it without asking the clients to do it.

Bacially users can develop thier own application and write java classes 
which they can change dynamically. The custom clasloader basically 
provides the dynamic loading of the classes - if there is a change in 
the classes, you dont need to restart the jvm again. Also ibatis is one 
of the libraries ( there are many) and these are always loaded using the 
custom classloaders and so it gives flexibility for them to load it 
anytime with their java classes.

In your suggestion, you mentioned about 
setClassLoader(yourEjbClasslOader).. guess you mean the arguement to be 
customClasslOader because ejbClassloader will not work.

Is is a good enhancement for ibatis to look for the classloader that 
loads its classes(Resources.java in this case) for getResources ?
Regards,
Ravi

Larry Meadors wrote:

>That is an interesting problem. I wonder why the custom class loader
>is not set as the thread class loader. Hm..oh well. :-)
>
>If we use the Resources.java class loader, everything breaks when
>people share the iBATIS jar files (i.e., in common/lib or shared/lib
>with tomcat..which IMO, is a bad idea anyway).
>
>You may want to try using Resources.setClassLoader(yourEjbClassLoader)
>to see if it makes things work. You will need to do that before the
>rest of iBATIS loads, so it may take some digging on your part to
>figure out WHERE to do that, but it is worth a try.
>
>Just curious, what environment is this in?
>
>Larry
>
>On 10/24/05, Ravi Krishnamurthy <ra...@savvion.com> wrote:
>  
>
>>Hello:
>>I have a custom classloader that has the ejbclassloader as the parent.
>>The custom classloader loads all the ibatis classes but the thread
>>context classloader is the ejbclassloader. So when the ibatis is trying
>>to load the resource, I get resource not found for the sql...dtd files.
>>On lookig at the source code looks like in the Resources.java of ibatis,
>>the getClassLoader first check the default Classloader and then the
>>Thread.contextClassloader. Looks like in my case, the defaultClassLoader
>>is null and so the context classloader (ejbclassloader) is used to
>>search for the resources and so things file.
>>
>>Could someone give me some pointers on how to resolve this problem.
>>
>>But wondering why the getClassLoader does not use the classloader that
>>loaded the Resources.java to search for the resources.
>>
>>Please note that the ibatis classes are only visible to the
>>cutomclassloader and not to the ejbclassloader.
>>
>>Thanks for your time,
>>
>>Regards,
>>Ravi
>>
>>
>>    
>>



Re: classLoaders

Posted by Larry Meadors <lm...@apache.org>.
That is an interesting problem. I wonder why the custom class loader
is not set as the thread class loader. Hm..oh well. :-)

If we use the Resources.java class loader, everything breaks when
people share the iBATIS jar files (i.e., in common/lib or shared/lib
with tomcat..which IMO, is a bad idea anyway).

You may want to try using Resources.setClassLoader(yourEjbClassLoader)
to see if it makes things work. You will need to do that before the
rest of iBATIS loads, so it may take some digging on your part to
figure out WHERE to do that, but it is worth a try.

Just curious, what environment is this in?

Larry

On 10/24/05, Ravi Krishnamurthy <ra...@savvion.com> wrote:
> Hello:
> I have a custom classloader that has the ejbclassloader as the parent.
> The custom classloader loads all the ibatis classes but the thread
> context classloader is the ejbclassloader. So when the ibatis is trying
> to load the resource, I get resource not found for the sql...dtd files.
> On lookig at the source code looks like in the Resources.java of ibatis,
> the getClassLoader first check the default Classloader and then the
> Thread.contextClassloader. Looks like in my case, the defaultClassLoader
> is null and so the context classloader (ejbclassloader) is used to
> search for the resources and so things file.
>
> Could someone give me some pointers on how to resolve this problem.
>
> But wondering why the getClassLoader does not use the classloader that
> loaded the Resources.java to search for the resources.
>
> Please note that the ibatis classes are only visible to the
> cutomclassloader and not to the ejbclassloader.
>
> Thanks for your time,
>
> Regards,
> Ravi
>
>

Re: classLoaders

Posted by Jeff Butler <je...@gmail.com>.
Simple solution - get rid of the custom classloader. The custom classloader
is likely to end up introducing hidden application server dependencies into
your code - because it is not safe to assume that all application servers
structure their classloaders the same way.
 If there is some compelling reason to have a custom classloader (do tell),
then maybe this would help:
 Resources.setDefaultClassLoader(yourCustomClassloader)
 Jeff Butler

 On 10/24/05, Ravi Krishnamurthy <ra...@savvion.com> wrote:
>
> Hello:
> I have a custom classloader that has the ejbclassloader as the parent.
> The custom classloader loads all the ibatis classes but the thread
> context classloader is the ejbclassloader. So when the ibatis is trying
> to load the resource, I get resource not found for the sql...dtd files.
> On lookig at the source code looks like in the Resources.java of ibatis,
> the getClassLoader first check the default Classloader and then the
> Thread.contextClassloader. Looks like in my case, the defaultClassLoader
> is null and so the context classloader (ejbclassloader) is used to
> search for the resources and so things file.
>
> Could someone give me some pointers on how to resolve this problem.
>
> But wondering why the getClassLoader does not use the classloader that
> loaded the Resources.java to search for the resources.
>
> Please note that the ibatis classes are only visible to the
> cutomclassloader and not to the ejbclassloader.
>
> Thanks for your time,
>
> Regards,
> Ravi
>
>