Hello Laurent, thank you for your interest. 2009/1/23 Laurent PETIT <[email protected]>
> Hello Gaetan, > > I'm one of the core developers of clojuredev, an open source project whose > goal is to provide clojure support for the Eclipse IDE. > What you say below is interesting, please see what I have noted inline --> > > 2009/1/23 gaetan <[email protected]> > >> >> Hi everybody, >> >> I am working in a software company specialized in Eclipse based >> product development (and member of the Eclipse Fundation). We are very >> interesting in clojure features and we plan to use it in some of our >> products. I am currently working on clojure integration in OSGi >> Bundles in order to embed code in Eclipse plugins. As mentioned in >> some posts the biggest problems is class loading. Indeed in OSGi each >> bundle has its own class loader and class loading is not based on the >> application classpath or on the current thread class loader. >> Consequently, it is very difficult to make clojure work with java code >> and to use OSGi visibility and dependencies system inside clojure. > > > For mere mortals like me, could you explain the problem via an example ? > (I understand there is a problem, I don't exactly understand what it really > is) > > Concerning clojuredev, we provide clojure as a separate plugin, which > exposes everything to plugins that depend on it. > Currently, clojuredev plugin is successful in calling clojure core > functions defined in clojure plugin, as well as loading new functions and > namespaces from clojuredev plugin. > I will try to give an example (I hope it will be understandable). First has you may now in OSGi (and therefor in Eclipse) each bundle declare its dependencies toward others in the MANIFEST.MF file. If you are developing a bundle "a" that needs a class in a bundle "b" you have to update the MANIFEST.MF file of "a" to said that it depends on "b" and "b" has to export the package that contains the class (this information is in the MANIFEST.MF file of b). Under the hood, each bundle has its own class loader that is fully aware of the dependencies and export of the plugin. So in the example above, at runtime the class loader of "a" will be able to use the class loader of "b" (thanks to the dependency declaration) and this one will be able to load the class for an external bundle (thanks to the export declaration). Now if you want to use clojure code in your OSGi instead of java. First you will embed clojure core in a specific bundle called "c". You write a clojure lib in "a" that use another clojure lib in "b". What will happen? To load code of "b" the lib in "a" will use the "use" (or "require") function of clojure core. This function use a specific class loader (called DynamicClassLoader) that use the class path of the bootstrapping thread. However this class path is not aware of the bundles inside the application and so the clojure class loader will not be able to find the lib in "b". Another case is if you want to use clojure code in "a" that use java code in "b". In this case clojure code use the "import" function of clojure core. This function use the Class#forName method that is based on the caller class loader. In this case the caller is clojure core and so its class loader is the class loader of "c". As this class loader as no dependencies toward "b", it will not be able to load the java class. As you can see the problem is a little tricky :-). That's why I think the best way to use clojure in OSGi bundles is to enable clojure to use bundles' class loader, it is flawless and understandable as it mimics java behavior. To do this I use clojure namespaces. In the example above the clojure lib in "a" must have a namespace that start with "a" so the clojure class loader can find and use the class loader of bundle "a" to load its dependencies. > > >> I >> think the best solution is to use bundles class loader inside clojure >> class loading system. I developed a proof of concept that uses a new >> class loader that extends clojure.lang.DynamicClassLoader with bundle >> class loading capability. To know which bundle use to load classes or >> script file the class loader uses the current namespace which has to >> reflect the bundle name (this is the java convention for bundles). In >> order to use this new class loader I had to modified >> clojure.lang.RT#baseLoader and makeClassLoader and >> clojure.lang.core#import. Moreover to test this I made a experimental >> Eclipse Builder that enable AOT compilation of mixed clojure and java >> plugin. So far it seems to work well: clojure and java interact >> seamlessly and it is very fun to interact dynamically with an Eclipse >> instance! >> >> I had some questions to the clojure community: >> * Whether it is possible to overload clojure class loading without >> introducing dependencies in clojure's core? >> * If their are some people interested in this application of clojure? >> (I can made my sources available) > > > We currently don't have made the AOT version of the eclipse builder, so if > you could publish what you've done so far that would be great, because we > could work on it, or it could give us some hints to make our own. > > Is it possible for you to publish it, maybe via the EPL, which seems to be > the 'defacto' Open source license to use when creating code around clojure ? > No problem I will release the code under EPL. However you must be aware that it is a proof of concept and there is a lot of things to fix and re-factor. I just have one question what is the best place to share the code ? > Regards, > > -- > Laurent > > >> Moreover I will made a post on Eclipse E4 project mailing list (work >> on the future of Eclipse) as they are very interested in dynamic >> languages. >> >> BR, >> >> Gaetan >> >> >> > > > > > Cheers, Gaetan --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---
