felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Benson Margulies <ben...@basistech.com>
Subject Re: dependencies
Date Sat, 15 Nov 2014 15:59:19 GMT
On Sat, Nov 15, 2014 at 10:12 AM, Stuart McCulloch <mcculls@gmail.com> wrote:
>
> On Saturday, 15 November 2014 at 14:30, Benson Margulies wrote:
> > I'm new. I bet that this is all written up somewhere; if not, I will be
> > happy to write up a wiki page.
> >
> >
>
> Most questions should already be covered by these links (the last two are referenced
from the first):
>
> http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html
> http://felix.apache.org/site/apache-felix-bundle-plugin-faq.html
> http://www.aqute.biz/Bnd/Format
>
> Since the plugin basically acts like a wrapper around bnd (providing default instructions
for maven projects, as well as translating maven conventions into bnd instructions) it’s
often useful to read about how bnd works first: http://www.aqute.biz/Bnd/Bnd. Especially as
bnd works differently to other packaging plugins by pulling classes/resources/jars into the
bundle according to the given instructions rather than just taking the entire content of “target/classes”.
> >
> > I'm packaging up a few items as OSGi bundles, and I'm perplexed by how the
> > maven-bundle-plugin related Maven dependencies to OSGi dependencies.
> >
> > Here are some very simple instructions:
> >
> > <instructions>
> > <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
> > <Export-Package>com.basistech.rosette.dm</Export-Package>
> > </instructions>
>
> These instructions say to embed all direct dependencies that have compile or runtime
scope by inlining them (ie. unpack them into the final bundle). Note that dependencies are
just matched according to the specified filters, it doesn’t make any difference whether
they’re already OSGi bundles or not. Transitive dependencies won’t be embedded because
you didn’t add <Embed-Transitive>true</Embed-Transitive>.
>
> The instructions also say to pull in all classes/resources under the com.basistech.rosette.dm
package from the build classpath and mark them as exported. The bundle plugin will also include
any local classes/resources from the current project in the bundle unless you override this
by specifying an explicit Private-Package.
>
> Once bnd has added the above classes/resources it will analyse their bytecode (and any
blueprint XML) to find out what packages are referenced, what packages are contained in the
bundle, and therefore what packages need to be imported from outside.
> >
> > The POM's dependency section lists two artifacts. One (a) is an OSGi
> > bundle built 'right next door', the other (b) isn't OSGI'd at all, its the
> > thing I'm trying to wrap. (b) in turn depends on Guava. My local copy of
> > Nexus is not configured at all for OBR.
> >
> > When I build, I end up with (a) embedded, the body of (b) embedded, and
> > Guava declared as a dependency! I suppose that i can get (b) disembedded by
> > making the Embed-Dependency more subtle, but how is a guava OSGi bundle
> > getting into the picture?
>
> This is what you told bnd to do via the bundle plugin - it embedded both a) and b) because
they are direct dependencies that match the Embed-Dependency filter. Since b) depends on Guava
and b)’s bytecode ends up embedded in the final bundle, bnd will detect that it needs Guava
(but doesn’t contain it) and therefore add the necessary “com.google.common” packages
to the Import-Package header.
>
> Unless you have a large number of dependencies and want to create an uber-bundle, I’d
suggest explicitly listing the specific dependencies you want embedded using something like
<Embed-Dependency>some-artifact|another-artifact;inline=true</Embed-Dependency>
- otherwise you might end up embedding more than you expect.


Thanks! These instructions:

                      <instructions>

<Export-Package>!*,com.basistech.rosette.dm</Export-Package>

<Embed-Dependency>adm-model;guava;inline=true</Embed-Dependency>
                        <Private-Package>sun.misc,com.google.*</Private-Package>
                        <Embed-Transitive>true</Embed-Transitive>
                    </instructions>

produced:

Export-Package: com.basistech.rosette.dm;uses:="com.basistech.rosette,co
 m.basistech.util";version="0.0.1"
Import-Package: com.basistech.rosette;version="[0.0,1)",com.basistech.ut
 il;version="[0.0,1)",javax.annotation,sun.misc

So far, so good.

I think that a stumbling block for me is that all my actual code is in
a Maven dependency, none of it's local. Until I added
Embed-Transitive, even 'direct' dependencies kept creeping into the
import list.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org


Mime
View raw message