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]>
>

Reply via email to