It may be much simpler than this. The key is to avoid creating a class using Class.forname as jdbc does. For spring the solution is to use SimpleDriverDataSource which is given the driver class. As this then happens in the bundle classloader of the datasource the
application bundle does not have to know which driver you use.

Do you think that will help?

Christian


Am 01.04.2011 15:53, schrieb Jean-Baptiste Onofré:
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é





--
----
http://www.liquid-reality.de

Reply via email to