问题
I have an OSGi bundle that is built using ANT and the classic BND tool. My bundle uses a library (JAR) internally, which is not available as a bundle within my OSGi container (Apache Felix). So, I am trying to embed it within my bundle, for access at runtime.
How can I embed such a library/JAR using ANT+BND? (Note : I cannot use MAVEN, using which this could have been a lot easier)
回答1:
You need two instructions in your bnd
descriptor. First use Include-Resource
to include the target JAR into your bundle:
Include-Resource: foo.jar
Then you need to specify that foo.jar needs to be on the bundle classpath. I assume that the bundle contents itself also needs to be part of the bundle classpath, so we need to include it as well with a dot:
Bundle-ClassPath: ., foo.jar
Note that @seh's answer about slurping the JAR's packages into your bundle with Private-Package
is also correct (in that case the JAR would need to be visible on the build-time classpath). I would never use Export-Package
for this though, because I think bundles should keep tight control over how much they export.
回答2:
There is a BND-supplied Ant task called "bndwrap". It is not well documented. When I've tried to use it, I had to read the Java code to see what it was doing. (See the bnd#doWrap() method here as well.)
I recall that it's also possible to "embed" a depended-upon Jar file another way: not directly as a Jar-within-a-Jar, but by slurping all of its classes into your bundle, simply by declaring in your Private-Package BND directive that the packages provided by the other Jar should be included in yours. Alternately, you can mention those packages in an Export-Package
directive to get them both included and exported.
来源:https://stackoverflow.com/questions/7554314/embed-thirdparty-jar-using-bnd