On Sat, Nov 15, 2014 at 10:12 AM, Stuart McCulloch <mccu...@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-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to