Hello

I do indeed have the JAR files available as part of the build process,
because as you say, javac needs them.  However, I can't see any parameter
for setting the "build path" in the documentation for BND (I'm assuming
that http://www.aqute.biz/Bnd/Format is where I should be looking).  I can
see the "classpath" attribute for the Ant task ("-classpath" in the ".bnd"
file), but as far as I understand from the documentation, that's just the
source from which BND will pull classes into the output bundle ".jar" file.

Do you mean that I should include classes and jar files into the
"classpath" parameter so that BND can see them to determine version ranges?
 Is there a risk of accidentally pulling in the dependencies into the
output ".jar" file (in other words, what stops BND from doing this : is it
the combination of Export-Package and Private-Package ?) ?

Or is the "build path" something that's managed by Eclipse, and obtained
from the ".classpath" file/parameter (we don't allow dependencies on
specific IDEs where I work, and Eclipse is only chosen by one or two team
members) ?

Or is it something to do with the "source path" referred to by
http://www.aqute.biz/Bnd/Ant ?  I can't figure out what it's supposed to do
or what format of information it expects.

Thanks,
Christopher



On 2 November 2012 23:45, Neil Bartlett <[email protected]> wrote:

> Yes you're correct that bnd does not NEED the packages referred to. If the
> bytecode in the JAR contains a reference to package "org.example" then that
> will be added as an Import-Package, irrespective of whether bnd can
> actually see "org.example" somewhere.
>
> However, if bnd CAN see that package somewhere, it does its best to use
> all the information available. So if you put the JAR containing
> "org.example" on the buildpath, and if that JAR happens to be a bundle with
> an Export-Package header that exports "org.example" as (say) version 1.0,
> then bnd will use that information to generate an Import-Package that with
> version range [1.0,2.0) or [1.0,1.1), depending on whether your bundle is a
> consumer or a produce of the API in question.
>
> If you're building your bundles from source then you basically always have
> the dependency JARs around, because javac needs them. Therefore if you can
> arrange for your dependencies to be bundles rather than plain JARs, and if
> you pass the same buildpath to bnd that you gave to the javac compiler,
> then the version ranges will be inferred.
>
> Because of this capability, I hardly ever have to manually override the
> Import-Package statement in my own bundles. It's only really necessary when
> I'm wrapping a pre-compiled binary JAR from somewhere else.
>
> Regards
> Neil
>
>
>
>    Christopher BROWN <[email protected]>
>  2 November 2012 22:28
> Hello,
>
> If there's a solution for bnd to determine the version range, then that
> sounds like the solution I'm looking for. However, I can't see how to do
> this... I use BND in two ways, either at the command line with a ".bnd"
> file, and using the Ant task. The only way I can see to set the classpath
> is for the class files that I want BND to pull into the output JAR. After
> reading various sources (including "osgibook_preview_20091217.pdf"), I was
> under the impression that BND determines the imports by inspecting the
> bytecode of the classes that make up the bundle, and doesn't actually
> require (or have any way of specifying) the packages and JAR files referred
> to.
>
> So I can't see how to tell it to inspect other JAR files to extract the
> version of different Export-Package headers. Could you point me to an
> example of how I can make a ".bnd" file and the Ant task add versioning
> information to the Import-Package header without me actually specifying it?
>
> Thanks,
> Christopher
>
>
>
>
>   Neil Bartlett <[email protected]>
>  2 November 2012 22:06
>  The requirement for the trailing star has never changed, as far as I
> remember.
>
> If you use Bndtools it will nag you that the trailing star is missing, and
> offer a quick-fix to put it there. Of course it can only be a warning
> because there are scenarios where the user really does know best and wants
> to explicitly define every import on the bundle.
>
> For the version issue, it's best if you can build your bundle against
> other bundles that have versioned exports. If you do this then bnd will
> automatically apply Semantic Versioning rules to set the correct import
> range.
>
> Regards
> Neil
>
>    Christopher BROWN <[email protected]>
>  2 November 2012 21:36
> Hello,
>
> I didn't have the wildcard at the end. That enabled all Import-Package
> statements.
>
> Did this change at some point in bnd's history? If I remember correctly,
> when I started building OSGi projects with bnd 0.0.384, it helpfully
> complained when I defined the Import-Package statement and forgot some
> imports.
>
> Now, it will tell me (with an explicit Import-Package header) when I've
> included an import for something I don't use (like "javax.*") but it won't
> tell me when I've forgotten. So by adding the "catch-all", it works with
> the caveat that I don't getted nagged to remind me (with a detailed build
> failure) that I might also want to specify a version range... The risk is
> that if the bundle gets deployed with a different version of the package,
> the dependency might be satisfied but because it can match any version of
> the package, I might get LinkageErrors...
>
> The trailing "*" means that more discipline is required to think about
> checking the generated MANIFEST.MF and watching commits from all
> contributors. It also means that I catch things needing optional
> resolution only when deploying, not when building.
>
> Given then that BND can indicate "things I imported but didn't need to", it
> would be very nice when using non-default import headers if it could also
> warn that "there are things you should import but didn't".
>
> Thanks for the feedback.
> Christopher
>
>
>
>   Neil Bartlett <[email protected]>
>  2 November 2012 17:42
>  Did you remember the catch-all "*" at the end of the import-package
> statement?
>
> --
> Neil Bartlett
> Sent from a phone
>
> On Friday, 2 November 2012 at 17:19, Christopher BROWN wrote:
>
>    Christopher BROWN <[email protected]>
>  2 November 2012 17:19
> Hello,
>
> Using current builds of BND (GitHub/Cloudbees), and referring to the
> documentation for BND, I'm observing odd behavior.
>
> It seems that BND only adds "javax" packages automatically to the
> MANIFEST.MF when the ".bnd" file contains NO "Import-Package" directive.
> However, I need to add explicit headers because BND can't guess the
> version ranges, so I add the headers manually with the version ranges. And
> suddenly, BND doesn't seem to detect and add the "javax" packages any more.
>
> Therefore, I'm getting ClassNotFoundExceptions from Apache Felix at runtime
> (with the helpful message telling me that the JDK and Felix export it)
> because there's no Import-Package header. This is similar to "classic"
> classpath problems in Java in that the failure occurs only when a specific
> code path is executed...
>
> I can test this by adding a dummy line such as:
> javax.sql.DataSource = null;
>
> ...anywhere in the bundle. This only fails when the JVM reaches this code,
> it doesn't prevent the bundle loading. Apache Felix obviously can't detect
> the problem when resolving the bundle because it's not explicitly imported,
> because BND isn't adding it.
>
> However, if I put say "javax.foobar.*" in my directive, BND gives me a
> warning.
>
> Is this a bug in BND ? Is there a way to make it "grumpy" so that it'll
> refuse to build my bundle if my imports are wrong?
>
> Thanks,
> Christopher
>
>

Reply via email to