Mark, No problem and I'm sorry to hear about your illness.
I've made some progress with clojure.osgi since I emailed you and am currently wrestling with this NoClassDefFoundError. It looks like one of my problems is that I do not have the <Clojure-Require> or <Clojure-Activator> pom tags. In fact, I haven't been using Maven at all; we're using lein and I've created a lein plugin that calls bnd to add the bundle metadata. I suppose, in the interim at least, I can create a pom and add these tags. My problems are being exacerbated I'm sure since my debugging process includes many, many iterations of hand-editing and attempting to run these bundles. In my problem bundle the activator is being called through the normal OSGi route. I assume that this is a problem for the Clojure OSGi bundle, yes? At some point I also tried to create my own Clojure OSGi bundle with the naive assumption that I could treat the Clojure jar as just another Java lib with the class loader stuff being taken care of in its activator. Is this possible? Thanks, Tim On 08/19/2014 01:58 AM, Mark Derricutt wrote: > > I've been meaning to replay to Tim's private email for ages but got > sidetracked with epic stomach flu and work. > > I've actually forked clojure-osgi and brought it up to date to Clojure > 1.6: > > |<dependency> > <groupId>com.theoryinpractise</groupId> > <artifactId>clojure.osgi</artifactId> > <version>1.6.0-1</version> > </dependency> > | > > This wraps a copy of clojure 1.6 itself, along with the clojure.osgi > support namespace, there's a very simple clojure+osgi demo at > https://github.com/talios/clojure.osgi.demo/blob/master/pom.xml > > I've been meaning to write up a blog post for ages on this, but since > I've been sidetracked and we've not yet got this working in production > ( it works, we've just not yet found a suitable part of our app to > rework yet - without other major changes ). > > The key part in the pom.xml are the two OSGi Manifest headers: > > |<Clojure-Require>com.theoryinpractise.clojureosgi.demo</Clojure-Require> > <Clojure-ActivatorNamespace>com.theoryinpractise.clojureosgi.demo</Clojure-ActivatorNamespace> > | > > The first being the namespace to (require) into the clojure runtime, > and the other the namespace to "executute" to startup. > > You can see in the > https://github.com/talios/clojure.osgi.demo/blob/master/src/main/clojure/com/theoryinpractise/clojureosgi/demo.clj > file we define two functions |bundle-start| and |bundle-stop| which, > as you can guess trigger when the bundle starts/stops. > > There's also the |(os/register-service)| macro call which takes an > interface, and a bunch of terms that reify into the interfaces methods > and registers this as an OSGi service for that interface. From within > these methods you just do your normal clojure stuff. > > One thing to note with a lot of the Clojure/OSGi stuff is that things > /really/ like being AOT'd so that bnd picks up the exports/imports > etc. etc. > > Tim - sorry for not getting back to you sooner. > > Mark > > On 19 Aug 2014, at 11:45, Neil Bartlett wrote: > > As far as I can tell Clojure is a black box to everybody, with the > possible exception of Mr Rich Hickey… > > Sorry I can’t help further. > > Neil > > On 19 August 2014 at 00:36:05, Tim McIver ([email protected] > <mailto:[email protected]>) wrote: > > I should also mention that I get different errors with this problem > bundle depending on how I bring the system up - and this could > indicate > that it is a Clojure issue. > > If I start the Felix console and install and start the bundles "by > hand", I get the error that I showed before. But if I start the Felix > console and the bundles are cached, then Felix automatically > starts them > and I get an error like the following: > > java.io.FileNotFoundException: Could not locate > com/example/MyClass__init.class or com/example/myclass.clj on > classpath > > (the .clj file is a Clojure source file). Now that I think about it > this could be due to the order in which the bundles are started. > Perhaps one of these bundles does not properly handle a missing > dependency. And the Clojure bundle is a bit of a black box to me at > this point. > > Tim > > On 08/18/2014 07:25 PM, Tim McIver wrote: > > Neil, > > Running that command shows that the correct package is being > imported > and resolved to the correct bundle. > > I should probably also mention that both the class that is being > instantiated as well as the class from which it is derived are > compiled > from Clojure code. This /shouldn't/ matter as there are .class > files > for both of these classes that are normal Java byte code. But > one of > the bundles that I'm using is a Clojure OSGi bundle. Clojure is > problematic in OSGi as it has its own classloader but this > bundle (not > created by me) /should/ handle this correctly, but I don't > know for sure. > > Tim > > On 08/18/2014 05:29 PM, Neil Bartlett wrote: > > Does the “problem bundle” import the package? You can > check this with the following command: > > inspect req osgi.wiring.package <bundle-id> > > Regards, > Neil > > On 18 August 2014 at 22:09:17, Tim McIver > ([email protected] <mailto:[email protected]>) wrote: > > Hello, > > I'm getting a NoClassDefFoundError when trying to start a > bundle that > resolves without error. This happens when trying to > instantiate a class > (in the bundle activator) whose .class file resides in the > bundle > itself. But the class being instantiated is derived from a > class found > in another bundle, already resolved and started. To > confirm that I've > got things wired up in the way that I think I do, I ran > the following > command at the Felix console: > > g! which <problem-bundle-id> > <fully-qualified-name-of-class-that-gives-noclassdeffounderror> > > and the response is good (I think): > > Loaded from: <com.example.impl> [50] > > where 50 is indeed the ID of the bundle where I'm > exporting package > com.example.impl. Any idea what could be causing this? > > Thanks, > Tim > > > ------------------------------------------------------------------------ > > To unsubscribe, e-mail: [email protected] > <mailto:[email protected]> > For additional commands, e-mail: > [email protected] > <mailto:[email protected]> > > ------------------------------------------------------------------------ > > To unsubscribe, e-mail: [email protected] > <mailto:[email protected]> > For additional commands, e-mail: [email protected] > <mailto:[email protected]> >

