You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-user@james.apache.org by Ben Lindahl <be...@gmail.com> on 2005/08/30 04:45:56 UTC

Classes Directory

Hey all,

I'm trying to set up a classes directory within one of my SAR projects. I 
realize that SAR-INF/classes doesn't work, but I would like to have a 
classes directory to avoid having to modify my application's configuration 
files in Jar files. The only solution I have come up with is to dynamically 
load a class directory at runtime through the UrlClassLoader, but this 
doesn't seem like a clean solution.

Has anyone else encountered a similar problem, and if so, how did you 
address it?

Thanks in advance!

- Ben

Re: Classes Directory

Posted by Ben Lindahl <be...@gmail.com>.
As it turns out, this ended up being a class loader problem. In reviewing 
the James source code, I see two problems:
1) It uses this.class.getClassLoader(), rather than the preferred 
Thread.currentThread.getContextClassLoader(). This is not a problem right 
now, as the Apache James developers have control over the entire 
application, but could become a difficult bug to track down in the future. 
In addition, as soon as you start adding multiple class loaders, chaining 
class loaders with parents becomes impossible (see next point) because it 
sets the same class loader as multiple parents. In the source code, all 
instances of this.getClass().getClassLoader() (or
whatever.getClass().getClassLoader())
should be replaced by Thread.currentThread().getContextClassLoader()
2) The greater problem is that it does not call
Thread.currentThread().setContextClassLoader(classLoader).
This means that any code that uses the standard method
Thread.currentThread().getContextClassLoader()
(as my code does) will not get the correct class loader, and thus will not 
be able to load the appropriate resources. In fact, I was getting the 
primary class loader, which only loads the Phoenix Jar. I had to add into my 
code the following (the class loader's parent is already set):
Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader
());
By the nature of Java class loaders, it is expected that the thread's 
Context ClassLoader is always kept current, and that any new class loaders 
are added to the chain. I think that this change should be made in the 
Apache James source code.

I realize that this is the Users list, so if I should send this e-mail to 
the Developers list, let me know.

Thanks,
Ben

On 8/31/05, Ben Lindahl <be...@gmail.com> wrote:
> 
> Actually, this is not resolved. It now loads classes from the classes 
> directory, but it does not load resources from there (this probably has 
> something to do with the fact that when it loads classes, it does not 
> actually load the classes directory onto the classpath). Therefore, I need a 
> way to get properties files as resources from the classpath, without putting 
> them in Jar files. Any ideas?
> 
> Thanks.
> 
> On 8/30/05, Ben Lindahl <be...@gmail.com> wrote:
> > 
> > It looks as though it should be using SAR-INF/classes, so perhaps the 
> > trouble I had was related to something else. It now does seem to be loading 
> > the class out of SAR-INF/classes.
> > 
> > Thanks.
> > 
> > On 8/30/05, Stefano Bagnara < apache@bago.org> wrote:
> > > 
> > > Hi Ben,
> > > 
> > > I've not encountered the problem, but I can give you an hint: you 
> > > should
> > > look at org.apache.james.transport.Loader to see how James does handle 
> > > the
> > > classloading for matcher/mailets. Maybe this helps. 
> > > 
> > > Stefano
> > > 
> > > > Hey all,
> > > >
> > > > I'm trying to set up a classes directory within one of my SAR
> > > > projects. I realize that SAR-INF/classes doesn't work, but I
> > > > would like to have a classes directory to avoid having to 
> > > > modify my application's configuration files in Jar files. The
> > > > only solution I have come up with is to dynamically load a
> > > > class directory at runtime through the UrlClassLoader, but
> > > > this doesn't seem like a clean solution. 
> > > >
> > > > Has anyone else encountered a similar problem, and if so, how
> > > > did you address it?
> > > >
> > > > Thanks in advance!
> > > >
> > > > - Ben
> > > 
> > > 
> > > --------------------------------------------------------------------- 
> > > To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> > > For additional commands, e-mail: server-user-help@james.apache.org 
> > > 
> > > 
> > 
>

Re: Classes Directory

Posted by Ben Lindahl <be...@gmail.com>.
Actually, this is not resolved. It now loads classes from the classes 
directory, but it does not load resources from there (this probably has 
something to do with the fact that when it loads classes, it does not 
actually load the classes directory onto the classpath). Therefore, I need a 
way to get properties files as resources from the classpath, without putting 
them in Jar files. Any ideas?

Thanks.

On 8/30/05, Ben Lindahl <be...@gmail.com> wrote:
> 
> It looks as though it should be using SAR-INF/classes, so perhaps the 
> trouble I had was related to something else. It now does seem to be loading 
> the class out of SAR-INF/classes.
> 
> Thanks.
> 
> On 8/30/05, Stefano Bagnara <ap...@bago.org> wrote:
> > 
> > Hi Ben,
> > 
> > I've not encountered the problem, but I can give you an hint: you should
> > look at org.apache.james.transport.Loader to see how James does handle 
> > the
> > classloading for matcher/mailets. Maybe this helps.
> > 
> > Stefano
> > 
> > > Hey all,
> > >
> > > I'm trying to set up a classes directory within one of my SAR
> > > projects. I realize that SAR-INF/classes doesn't work, but I
> > > would like to have a classes directory to avoid having to 
> > > modify my application's configuration files in Jar files. The
> > > only solution I have come up with is to dynamically load a
> > > class directory at runtime through the UrlClassLoader, but
> > > this doesn't seem like a clean solution. 
> > >
> > > Has anyone else encountered a similar problem, and if so, how
> > > did you address it?
> > >
> > > Thanks in advance!
> > >
> > > - Ben
> > 
> > 
> > --------------------------------------------------------------------- 
> > To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> > For additional commands, e-mail: server-user-help@james.apache.org 
> > 
> > 
>

Re: Classes Directory

Posted by Ben Lindahl <be...@gmail.com>.
It looks as though it should be using SAR-INF/classes, so perhaps the 
trouble I had was related to something else. It now does seem to be loading 
the class out of SAR-INF/classes.

Thanks.

On 8/30/05, Stefano Bagnara <ap...@bago.org> wrote:
> 
> Hi Ben,
> 
> I've not encountered the problem, but I can give you an hint: you should
> look at org.apache.james.transport.Loader to see how James does handle the
> classloading for matcher/mailets. Maybe this helps.
> 
> Stefano
> 
> > Hey all,
> >
> > I'm trying to set up a classes directory within one of my SAR
> > projects. I realize that SAR-INF/classes doesn't work, but I
> > would like to have a classes directory to avoid having to
> > modify my application's configuration files in Jar files. The
> > only solution I have come up with is to dynamically load a
> > class directory at runtime through the UrlClassLoader, but
> > this doesn't seem like a clean solution.
> >
> > Has anyone else encountered a similar problem, and if so, how
> > did you address it?
> >
> > Thanks in advance!
> >
> > - Ben
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> For additional commands, e-mail: server-user-help@james.apache.org
> 
>

Re: Classes Directory

Posted by Stefano Bagnara <ap...@bago.org>.
Hi Ben,

I've not encountered the problem, but I can give you an hint: you should
look at org.apache.james.transport.Loader to see how James does handle the
classloading for matcher/mailets. Maybe this helps.

Stefano

> Hey all,
> 
> I'm trying to set up a classes directory within one of my SAR 
> projects. I realize that SAR-INF/classes doesn't work, but I 
> would like to have a classes directory to avoid having to 
> modify my application's configuration files in Jar files. The 
> only solution I have come up with is to dynamically load a 
> class directory at runtime through the UrlClassLoader, but 
> this doesn't seem like a clean solution.
> 
> Has anyone else encountered a similar problem, and if so, how 
> did you address it?
> 
> Thanks in advance!
> 
> - Ben


---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
For additional commands, e-mail: server-user-help@james.apache.org