On 3/30/12 9:14, Robert Munteanu wrote:
-----Original Message----- From: Richard S. Hall [mailto:he...@ungoverned.org] Sent: Thursday, March 29, 2012 6:53 PM To: dev@felix.apache.org Subject: Re: Enhanced Apache Felix / JRebel integration On 3/29/12 6:45, Robert Munteanu wrote:Hi, I am looking into enhancing the integration between Apache Felix andthe JRebel [1] JVM agent. If you're not familiar with JRebel, it's a java agent which allows classes loaded into the JVM to be redefined as soon as they are recompiled e.g. in an IDE. For more information about its features, see [2].JRebel already has basic support for Apache Felix by allowing classesfor a deployed bundle to be reloaded without requiring a bundle repackage and reinstall.What I want to contribute is support for components managed usingdeclarative services. The basic principle is that given a bundle which contains service components descriptors, watch for changes to those component descriptors and refresh the components when the respective descriptors have changed.I have taken a quick look at both JRebel and Felix to see how animplementation should look like. JRebel offers support for detecting class changes, but not generic filesystem changes. Therefore I'd have to rely on Felix code ( in org.apache.felix.scr ? ) to detect- when a bundle with component descriptors is deployed and startwatching for changes to the descriptors- when changes to the mentioned descriptors are detected refresh thecomponents Is there some reason you need to refresh at the class level as opposed to the bundle level? If the bundle level was sufficient then it seems like this scenario becomes much simpler.My intention is to first refresh the whole bundle when a component descriptor is changed. If needed I will look into fine-grained refreshes but that's not on my immediate plan.
Refreshing the bundle would definitely be easier.
Also, what do you mean by "refresh the components" above? Do you specifically mean re-load the class bytes? If so, how do you know that changes to the descriptor require re-loading the class bytes or are you just assuming it does?By refresh I mean a deactivate/activate operation taking into account whether a component is marked as immediate or not. Fortunately refreshing the actual class bytes is handled by the 'core' JRebel functionality when the class file changes.Additionally, it seems you might be confused about the responsibility of some tasks. For example, SCR doesn't look for changes in component descriptors at all, it simply listens for bundles to be activated. Listening to changes in the component descriptor would have to hook into the build process somehow. By and large, none of the Felix subprojects are involved in the build process other than the Maven Bundle plugin.I have considered hooking into the maven-bundle-plugin as well, but I have no idea on how to notify Felix that a bundle needs to be refreshed or even send a custom event which I can handle myself.
If you use something like File Install and generate bundle's into a directory managed by File Install, it will automatically update and refresh the bundle when its JAR file changes, which would cause SCR to stop, then restart managing it. It's a little more coarse grained that what you want, but it should work out of the box with a lot less effort.
-> richard
Thanks, Robert-> richardI would like to validate that this is at all possible within ApacheFelix and to ask which are the best places to start looking for adding the JRebel functionality. Any thoughts/pointers on how to best start developing this would be greatly appreciated.If this is feasible, I intend to develop this as a separate JRebelplugin and contribute it to the Apache Felix project.Thanks, Robert [1]: http://zeroturnaround.com/jrebel/ [2]: http://zeroturnaround.com/jrebel/features/