Also, there is a pretty extensive description of the approach to
modularity that Java plans to support in the next major release, in
JSR-000277. Not necessarily fitting Clojure, but most likely close to
what we'll have to deal with in the future.

On Jan 29, 9:52 am, Rich Hickey <richhic...@gmail.com> wrote:
> On Jan 28, 2009, at 10:27 AM, Ferdinando Villa wrote:
>
>
>
>
>
> > Clojure is saving our life and enabling thing we would never have
> > dreamed of without in our ARIES project (http://
> > ecoinformatics.uvm.edu/
> > aries). Still, we need to hack RT in order to be able to use it. I've
> > seen some discussion on classloader flexibility in the context of
> > Eclipse integration. In our case, we use a similar environment (JPF
> > plugin framework, may move to similar OGSI later) where Clojure
> > bindings are loaded by each plugin in sequence, each having to use a
> > specific classloader in order to see the Java classes in the plugin.
> > Because there is one RT, we're not going to make it work unless we
> > manually switch the classloader Clojure uses to the plugin-specific
> > one every time we load bindings. This requires making a field public
> > and it's, generally speaking, a ugly hack. Also, because we run in a
> > multi-user server environment, we'd love to have one RT per session so
> > we could only load what's needed there and not pollute the runtime in
> > other sessions. Or even RT objects arranged in a tree so each can use
> > the parent's environment and cleanly be disposed of when not needed
> > anymore.
>
> > All this is clearly hard to do with the current static Clojure
> > runtime. How much of this is a choice, and how much is likely to
> > change in the future? We'd love to use Clojure as is.
>
> Let me first state that I am very interested in supporting people  
> using environments like OSGi etc. That said, I have yet to see any  
> proper description of how these environments purport to support  
> dynamic compiled bytecode and the other things a dynamic, non-
> interpreted language like Clojure might need.
>
> All these environments invent their own semantics for classloaders,  
> ignoring/modifying to various degrees delegation, context classloaders  
> etc. So, there's no standard way to support these environments. Even  
> standard Java libs can run into trouble or require code modifications  
> to work. But I will consider hooks, or conditional code in order to do  
> special handling, if only there was some documentation indicating the  
> environment has a solution for anything other than static Java.
>
> Here are some of the things Clojure needs:
>
> - It needs to create classes from bytecode in memory (at least for  
> dynamic-loaded cljs and eval/repl). With Java proper, there is no way  
> to do this other than to create a custom classloader. That classloader  
> needs to be rooted, and since these environments are constantly  
> swapping out loaders, finding a suitable root that leaves the class  
> accessible can be a challenge.
>
> - It needs to proxy Class.forName. Many of these environments assume  
> compiled Java that, when needing to find classes dynamically, will  
> call Class.forName directly. This call looks back in the stack for the  
> caller, and uses its classloader. However, when the call is indirect,  
> via a library, like calls through Clojure's import, then this  
> mechanism resolves with the library's loader. This causes problems  
> when the consumer's loader doesn't share a hierarchical relationship  
> with the library's, or when delegation is disabled. But it seems that  
> these environments stop considering dynamic use at "just use  
> Class.forName and you'll get your bundle/module's loader".
>
> Conversely, people that want to use these environments, which base  
> their modularity around classloaders, don't seem to want to use  
> classloaders to get multiple independent Clojure instances, when that  
> is precisely the way to do that. If you want one RT per session, load  
> Clojure into a classloader per session. Clojure is compiled, like  
> Java, and has a single namespace, like Java, and it you want  
> independence/security, you use classloaders, like Java. Being in a  
> module system doesn't necessarily mean that Clojure should be a shared  
> module.
>
> If Clojure's RT/Namespace environment was not static, there would then  
> be different instances, and those instances would have to be threaded,  
> interpreter style, through the call chain, and names would have to be  
> resolved dynamically with lookups. This would impact performance and  
> interoperability.
>
> Since it seems like you have something that works, but requires a  
> hack, could you describe more fully what you are doing, and how  
> Clojure could better support it (needed hooks etc)?
>
> Anyone doing OSGi etc can please chime in with as well.
>
> Thanks,
>
> Rich
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to