blob: b0b92a8b43cc2af5081c7068da65e691f011d79b [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<chapter id="developing">
<title>Developing OSGi Bundles</title>
<para>The Tools provide functionality that makes developing OSGi bundles, especially the editing of MANIFEST.MF files,
easier.
</para>
<section id="tooling-developing-resolving-bundle-dependencies">
<title>Resolving Bundle Dependencies</title>
<para>
While working with OSGi bundles, one of the most interesting and challenging aspects is defining the package, bundle,
and library imports in the manifest and then keeping this in sync with your compile classpath either in Ant and Maven
or Eclipse. In most cases you would typically be required to manually set up the Eclipse classpath. Ultimately, the
Eclipse compile classpath is still different from the bundle runtime classpath, as normally an entire JAR file is
being made available on the Eclipse classpath but not necessarily at runtime due to the explicit visibility rules
defined in
<code>Import-Package</code>
headers.
</para>
<para>
The Tools address this problem by providing an Eclipse classpath container that uses an
@umbrella.product.name@-specific dependency resolution mechanism. This classpath container makes resolved
dependencies available on the project&rsquo;s classpath but allows only access to those package that are imported
explicitly (e.g., via
<code>Import-Package</code>
) or implicitly by using
<code>Import-Library</code>
or
<code>Import-Bundle</code>
.
</para>
<para> To use the automatic dependency resolution, an OSGi bundle or PAR project needs to be targeted to a configured
@umbrella.product.name@ instance. This can be done from the project&rsquo;s preferences by selecting the runtime on
the "Targeted Runtimes" preference page. </para>
<para>
<note>
In most scenarios it is sufficient to target the PAR project to a runtime. The nested bundles will then
automatically inherit this setting.
</note>
</para>
<para>
<imagedata fileref="images/tooling-classpath.png" format="PNG" />
</para>
<para> After targeting the project or PAR you will see a "Bundle Dependencies" classpath container in your Java
project. It is now safe to remove any manually configured classpath entries. </para>
<para> The classpath container will automatically attach Java source code to the classpath entries by looking for
source JARs next to the binary JARs in the @umbrella.product.name@&rsquo;s repository. You can also manually override
the source code attachment by using the properties dialog on a single JAR entry. This manual attachment will always
override the convention-based attachment. </para>
</section>
<section id="tooling-developing-editing-manifest-mf">
<title>Editing the Manifest</title>
<para>
The Tools provide a Bundle Manifest Editor that assists the developer to create and edit MANIFEST.MF files. The
editor understands the @umbrella.product.name@ specific headers like
<code>Import-Library</code>
and
<code>Import-Bundle</code>
and provides content assist features while editing source code. Furthermore a Eclipse Form-based UI is also
available.
</para>
<para> To open the Bundle Manifest Editor right click a MANIFEST.MF file and select "Bundle Manifest Editor" from the
"Open With" menu. </para>
<para>
<note>
Please note that the @umbrella.product.name@ specific manifest headers appear in green color to distinguish them
from those headers defined in the OSGi specification. This also makes navigating much easier.
</note>
</para>
<para>
<imagedata fileref="images/tooling-manifest-source-editor.png" format="PNG" />
</para>
<para> The content assist proposals in the source tab as well as in the UI-based tabs are resolved from the bundle and
library repository of an installed and configured @umbrella.product.name@. Therefore it is important to target the
project or PAR to a specific @product.instance@ to indicate to the tooling which bundle repository
to use. </para>
<para>
<note>
If a OSGi bundle project is not targeted to a @product.instance@, either directory or indirectly
via a PAR project&rsquo;s targetting, the manifest editor will not be able to provide content assist for importing
packages, bundles, and libraries.
</note>
</para>
<para>
<imagedata fileref="images/tooling-manifest-form-ui-editor.png" format="PNG" />
</para>
<para> The Dependencies tab of the Bundle Manifest Editor enables the user to easily download and install bundles and
libraries from the @ebr@ by using the "Download..." buttons next to the "Import Bundle" and "Import Library"
sections. </para>
</section>
</chapter>