Hi Hervé,

Another way that should work is to use Bundle Fragment.
It creates a classloader by gathering classloaders from the fragment.

I made an introduction to OSGi where I explain especially classloaders (it's just some slides). I can send to you if you want.

Regards
JB

On 04/01/2011 03:53 PM, Hervé BARRAULT wrote:
Hi Charles

Thanks for answer.

So, if one day i need to add another driver bundle D3, i will be forced to
rebuild my bundle B.
And in my case, for each instance i would only use one of D1, D2, D3 but i
should deploy all drivers.

Regards

2011/4/1 Charles Moulliard<[email protected]>

Hi Herve,

Blueprint or Spring DM mechanism which allows to proxified spring bean
and refer them in OSGI service is a completely independant from the
OSGI versioning and class loading resolution.

What you can do in bundle B is to use the<Require-Bundle>
instructution pointing to BundleSymbolic-Name of wrapped bundles D1
and D2. In this case, you do not need to import those packages.

Regards,

Charles Moulliard

Sr. Principal Solution Architect - FuseSource
Apache Committer

Blog : http://cmoulliard.blogspot.com
Twitter : http://twitter.com/cmoulliard
Linkedin : http://www.linkedin.com/in/charlesmoulliard
Skype: cmoulliard



On Fri, Apr 1, 2011 at 3:29 PM, Hervé BARRAULT<[email protected]>
wrote:
Hi,
i'm asking a question about the dependency management and the publication
of
OSGI services.

Here a explanation of the situation :

I have a bundle D1 exporting its packages (a wrapped JDBC driver).

I have a bundle D2 exporting its packages (another wrapped JDBC driver).


I have a bundle DS : a datasource with the following spring file (here an
extract) :

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
        <property name="driverClassName" value="${DB_DRIVER}"/>
        <property name="url" value="${DB_URL}"/>
        <property name="username" value="${DB_USER}"/>
        <property name="password" value="${DB_PWD}"/>
        <property name="poolPreparedStatements" value="true"/>
    </bean>
<osgi:service id="my-ds" ref="datasource"
interface="javax.sql.DataSource"
/>

DS is importing packages from D1 AND D2
<Import-Package>oracle.jdbc.driver;resolution:=optional,
                           com.microsoft.sqlserver;resolution:=optional,
                           org.apache.commons.dbcp,
                           javax.sql
</Import-Package>

With these bundles all its ok.


And finally,I have my annoying Bundle B importing the datasource and
using
it :
<osgi:reference id="my-ds" interface="javax.sql.DataSource" />

In bundle B, i import javax.sql.DataSource.
But i should also import packages exported by D1 and D2 otherwise i have
an
exception when it's trying to create the driver (the class files are in
D1
or D2).

I thought that the service will be exported with the needed dependencies.

Is there a way to not declare import of D1 and D2 (in Bundle B) ? [I know
there is DynamicImport-Package but i would rather using it].
Why an imported service is not coming with its own dependencies (is there
a
way to do it)?

Regards
Hervé



Reply via email to