You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by Martijn Hendriks <ma...@gx.nl> on 2007/11/12 16:40:26 UTC

Maven bundle plugin

Hi,

We're moving from the old maven-osgi-plugin to the maven-bundle-plugin.
We used to have a osgi-bundle subproject that embedded a library and
another jar subproject that had a compile-scope dependency on the
bundle. This worked fine. Now we're using the maven-bundle-plugin (with
the directive
<Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>) to
build the first subproject. The bundle contents look ok...all classes
are there. Unfortunately, the unit tests now fail due to a
NoClassDefFoundError: the classes in the embedded library in the bundle
cannot be found during the unit tests. When the inline option is set to
"true", then it works again. Is there a way to not inline the compile
scope dependencies in the bundle and make this work? Thanks!

Best regards,

Martijn

--

Martijn Hendriks
<GX> creative online development B.V.
 
t: 024 - 3888 261
f: 024 - 3888 621
e: martijnh@gx.nl
 
Wijchenseweg 111
6538 SW Nijmegen
http://www.gx.nl/ 

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


RE: Maven bundle plugin

Posted by Martijn Hendriks <ma...@gx.nl>.
Hi Stuart,

>    <Embed-Dependency>*;scope=compile;inline=true</Embed-Dependency>
> BTW, the reason your setup worked with the old 
> maven-osgi-plugin was because it assembled the bundle 
> contents in the output folder (ie. target/classes) before 
> finally jar'ing everything up - and in Maven, any dependent 
> projects in the same reactor use the 'target/classes' 
> directory instead of the artifact file

I already wondered why it worked with the osgi-plugin in the first place
and this explains it.

> with the bundle-plugin, because the Bnd tool assembles the 
> bundle in memory, there's no unpacked content under 
> 'target/classes' to match the classpath that Maven passes to 
> the unit tests - however you can get this by using the maven 
> dependency plugin to unpack the bundle (ie. either unpack it 
> to 'target/classes'
> in the bundle project or the unit test project)
> 
> HTH

Yes, it does :) Thanks.

Martijn

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


Re: Maven bundle plugin

Posted by Stuart McCulloch <st...@jayway.net>.
On 12/11/2007, Martijn Hendriks <ma...@gx.nl> wrote:
>
> Hi,
>
> We're moving from the old maven-osgi-plugin to the maven-bundle-plugin.
> We used to have a osgi-bundle subproject that embedded a library and
> another jar subproject that had a compile-scope dependency on the
> bundle. This worked fine. Now we're using the maven-bundle-plugin (with
> the directive
> <Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>) to
> build the first subproject. The bundle contents look ok...all classes
> are there.


by this I assume you mean the embedded jarfile is there - if inline is set
to false
the jarfile will be embedded as single jar instead of inlined as a set of
classes and
will also be added to the Bundle-ClassPath.

note that you should _not_ set Export-Package to * as this will also include
all the
compile scope classes inside the bundle, which is not necessary with
embedding
- if you want to export the complete contents without pulling in all compile
scope
classes then use <_exportcontents>*</_exportcontents>

also remember that any classes in an embedded jar inside a bundle, while
visible
to OSGi, will not be visible during standard 'javac' compilation or in
standard Java
applications run outside of an OSGi container (as the default classloader
doesn't
know about the embedded jar)

Unfortunately, the unit tests now fail due to a
> NoClassDefFoundError: the classes in the embedded library in the bundle
> cannot be found during the unit tests. When the inline option is set to
> "true", then it works again.


if your unit tests are run outside of an OSGi container then I would expect
this,
as the test framework would not see the embedded jar on the basic classpath

Is there a way to not inline the compile
> scope dependencies in the bundle and make this work? Thanks!


you kind of answered this yourself in the sentence above - if you want
embedded
classes available when you use the bundle outside of OSGi (ie. as a plain
library)
then they must be inlined, ie:

   <Embed-Dependency>*;scope=compile;inline=true</Embed-Dependency>
BTW, the reason your setup worked with the old maven-osgi-plugin was because
it assembled the bundle contents in the output folder (ie. target/classes)
before
finally jar'ing everything up - and in Maven, any dependent projects in the
same
reactor use the 'target/classes' directory instead of the artifact file

so the unpacked bundle contents were available to your unit tests - however
if
you cleaned the bundle project then went to the unit test project and re-ran
it,
it would fail, as it would use the final bundle file

with the bundle-plugin, because the Bnd tool assembles the bundle in memory,
there's no unpacked content under 'target/classes' to match the classpath
that
Maven passes to the unit tests - however you can get this by using the maven
dependency plugin to unpack the bundle (ie. either unpack it to
'target/classes'
in the bundle project or the unit test project)

HTH

Best regards,
>
> Martijn
>
> --
>
> Martijn Hendriks
> <GX> creative online development B.V.
>
> t: 024 - 3888 261
> f: 024 - 3888 621
> e: martijnh@gx.nl
>
> Wijchenseweg 111
> 6538 SW Nijmegen
> http://www.gx.nl/
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
>
>


-- 
Cheers, Stuart