Hi David

You're right, this looks doable.

However, looking further into my non-OSGified library, I see code like

Thread.currentThread().getContextClassLoader().getResourceAsStream(..)

:-( This won't find the resource in the bundle classpath, as far as I can see.
It seems non-trivial to develop a library that works both in JEE and OSGi.

Martin

-------- Original Message --------
Subject: Re: How to make java.util.ServiceLoader work?
From: David Bosschaert <[email protected]>
To: [email protected]
Date: Sun, 9 Sep 2012 18:39:16 +0100
Hi Martin,

If you use the static weaving with SPI Fly it should be of very low
impact. It will basically create you a modified bundle that works in
OSGi. It has a dependency the SPI Fly static bundle, but you should be
able to merge those classes in...

Cheers,

David

On 8 September 2012 20:01, Martin Lichtin <[email protected]> wrote:
Hi David

Thanks! I actually came across SPI-Fly before posting, but it seemed like
a "big thing" to introduce at the current situation with my project.

What I would like in the short term is to inline the library (2 artifacts)
and "fix" some of the classes, ie. provide my own code for them.
I think it can be achieved with

<Embed-Dependency>scope=compile|runtime;artifactId=a1|a2;inline=true;inline=!**/SP.class;inline=!**/RP*.class</Embed-Dependency>

However, the instruction

inline=!**/SP.class;inline=!**/RP*.class

to exclude a total of four classes does not work quite right.
I also tried

inline=!**/SP.class|**/RP*.class

without any luck.

Martin



-------- Original Message --------
Subject: Re: How to make java.util.ServiceLoader work?
From: David Bosschaert <[email protected]>
To: [email protected], Martin Lichtin <[email protected]>
Date: 9/7/2012 4:42 PM

Hi Martin,

You may want to take a look at the SPI Fly component in Apache Aries:
http://aries.apache.org/modules/spi-fly.html - this allows you to do
this relatively easily.
Additionally, the OSGi Enterprise Spec 5 chapter 133 covers this [1].

Cheers,

David

[1] www.osgi.org/Download/Release5

On 7 September 2012 14:50, Martin Lichtin <[email protected]> wrote:
Hi

  From an OSGi bundle I need to call a library that itself uses
ServiceLoader to lookup/load a service provider class.

This does not seem to work, however.
java.util.ServiceLoader.load(x.api.z) returns no providers.

I embedded the library, so both file META-INF/services/x.api.z and class
x.spi.z are part of my bundle JAR.
I thought this would be enough to get ServiceLoader to work, but no :-(

Any ideas?


I already tried

           ClassLoader thread =
Thread.currentThread().getContextClassLoader();

Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
           <call-library>
           Thread.currentThread().setContextClassLoader(thread);


in case TCCL would be the problem, but that didn't help.

Martin

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to