| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" |
| "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> |
| <book xmlns:xi="http://www.w3.org/2001/XInclude"> |
| <bookinfo> |
| <title>Eclipse Gemini Blueprint</title> |
| |
| <subtitle>Frequently Asked Questions</subtitle> |
| <releaseinfo>&version;</releaseinfo> |
| |
| <authorgroup> |
| <author> |
| <firstname>Costin</firstname> |
| <surname>Leau</surname> |
| <affiliation>SpringSource</affiliation> |
| </author> |
| </authorgroup> |
| |
| <legalnotice> |
| <para>Documentation made available under the terms of the Eclipse Public License v1.0 |
| and Apache License v2.0 which accompanies this distribution. |
| The Eclipse Public License is available at <ulink url="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</ulink> and |
| the Apache License v2.0 is available at <ulink url="http://www.opensource.org/licenses/apache2.0.php">http://www.opensource.org/licenses/apache2.0.php</ulink>. |
| You may elect to redistribute this code under either of these licenses.</para> |
| </legalnotice> |
| |
| <copyright> |
| <year>2006 -</year> |
| <year>2011</year> |
| <holder>VMware Inc.</holder> |
| <holder>Oracle Inc.</holder> |
| </copyright> |
| |
| </bookinfo> |
| |
| <toc /> |
| |
| <chapter id="spring-osgi-faq"> |
| <title>Frequently Asked Questions</title> |
| |
| <section id="eclipse-springdm"> |
| <title>What's the relationship between Spring Dynamic Modules and Gemini Blueprint?</title> |
| |
| <para>Eclipse Gemini Blueprint is based on Spring Dynamic Modules 2.0 which has been migrated |
| to the Eclipse Foundation. While the name and the packages have changed the internals are still the same; one |
| will find both names are used interchangeably (especially by those that have used Spring DM for a while). |
| Further more, all Spring DM applications are supported by Gemini Blueprint (do pay attention to the migration guide available |
| <ulink url="http://www.eclipse.org/gemini/blueprint/documentation/migration/">here</ulink>).</para> |
| </section> |
| |
| <section id="name-change"> |
| <title>What happened to "Spring OSGi" project name?</title> |
| |
| <para>The OSGi term is a trademark belonging to <ulink |
| url="http://www.osgi.org/">The OSGi Alliance</ulink>. In order to |
| comply with their guidelines, it was decided that the project name |
| be changed to "Spring Dynamic Modules for OSGi Service Platforms" |
| (aka Spring DM). The new name is still pending final approval |
| by the OSGi Alliance. |
| The name change was the result of an amicable discussion between |
| the OSGi Alliance and Interface21. Interface21 is a member of the |
| OSGi Alliance, and the OSGi Alliance remain very supportive of |
| the project. |
| Note that Spring Dynamic Modules has moved to Eclipse Foundation to form Gemini Blueprint project (see above)</para> |
| </section> |
| |
| <section id="internal-package"> |
| <title>Why aren't there any javadocs on <literal>*.internal.*</literal>?</title> |
| |
| <para><literal>org.eclipse.gemini.blueprint.*.internal</literal> packages are |
| meant (as the name implies) to be private and non-public package. Thus, |
| there is no documentation, support or compatibility guarantee for |
| them. In fact, the Gemini Blueprint bundle does not even export |
| them to prevent accidental usage.</para> |
| |
| <para>If you find classes under this package, which you really, really |
| depend on, then consider raising an issue on <ulink type="" |
| url="http://opensource.atlassian.com/projects/spring/browse/OSGI">JIRA</ulink> |
| to have access opened up.</para> |
| </section> |
| |
| <section id="requirements"> |
| <title>What are Gemini Blueprint requirements?</title> |
| <para> |
| Gemini Blueprint requires at least Java 1.5, OSGi 4.1 and Spring 3.0. |
| It might be possible to use Gemini Blueprint on a lower <ulink |
| url="http://wiki.eclipse.org/index.php/Execution_Environments">execution environment</ulink> |
| (such <ulink url="http://java.sun.com/products/cdc/">CDC</ulink>) but |
| it is not guaranteed to work. |
| Both Spring and Gemini Blueprint rely on <ulink url="http://java.sun.com/products/javabeans/"> |
| JavaBeans</ulink> (java.beans package) which, unfortunately, is missing in most |
| restricted environments. See this <ulink url="http://java.sun.com/products/cdc/reference/cdc_packages.pdf" |
| type="application/pdf">PDF</ulink> for information on CDC profiles. |
| Note that, Spring 3.0 also requires Java 1.5. For Spring 2.5 and/or Java 1.4 see |
| <ulink url="http://www.springframework.org/osgi">Spring Dynamic Modules</ulink> 1.x releases. |
| </para> |
| <para> |
| Nevertheless, experiences and feedback on running Gemini Blueprint in restricted environments |
| is welcomed - please use our mailing list. |
| </para> |
| </section> |
| |
| <section id="other-module-frameworks"> |
| <title>Are there plans to support other dynamic module frameworks (such as the JSR 277 extensions in Java 7)?</title> |
| <para>There are no current plans to support other dynamic module frameworks.</para> |
| </section> |
| |
| <section id="restricted-environments"> |
| <title>Will Gemini Blueprint work in restricted environments (such as small/mobile devices)?</title> |
| <para>See the <link linkend="requirements">requirements</link> entry. The OSGi Service Platform is designed to run in |
| very constrained environments however, Gemini Blueprint depends on the Spring Framework v3.0 which in turn depends on |
| JDK 1.5. Thus Gemini Blueprint cannot run on more constrained environments (such as the OSGi Minimum Execution Environment) |
| unless Spring itself also runs in those environments. There are no current plans to make such a version of Spring. |
| However as existing OSGi developers adopt Gemini Blueprint to simplify creation of OSGi applications and the user |
| base expands, the target audience can cover domains much broader than <emphasis>enterprise Java applications</emphasis>. |
| In time this could create a large enough demand to justify the investment needed to allow Spring and Gemini Blueprint to run in |
| restricted environments.</para> |
| </section> |
| |
| |
| |
| <section id="supported-osgi-platforms"> |
| <title>What OSGi platforms are supported?</title> |
| <para> |
| Gemini Blueprint requires an OSGi 4.2 (though it might work on OSGi 4.0 and 4.1) platform. The framework has been tested |
| on <ulink url="http://www.eclipse.org/equinox/">Equinox</ulink>, <ulink url="http://felix.apache.org">Felix</ulink> |
| and <ulink url="http://www.knopflerfish.org/">Knopflerfish</ulink> |
| - in fact, the test suite is <ulink url="http://build.springframework.org:8085/bamboo/browse/OSGI">ran</ulink> |
| against all of them as part of our continuous integration process. |
| </para> |
| </section> |
| |
| |
| <section id="osgi-intro"> |
| <title>Where can I learn about OSGi?</title> |
| <para> |
| The best place to start is The Osgi Alliance <ulink url="http://www.osgi.org/">home</ulink> and |
| <ulink url="http://www2.osgi.org/Main/HomePage">developer</ulink> pages which |
| provide the OSGi specifications, introductions and many links and blogs on the topic. |
| Please see the reference documentation appendix for more information. |
| </para> |
| |
| <para> |
| In addition, all OSGi implementation websites host detailed, step-by-step tutorials and introduction. |
| </para> |
| |
| <para> |
| If you discover any additional materials useful for OSGi newbies, please let us know to update the list. |
| Thank you. |
| </para> |
| </section> |
| |
| <section id="building-the-sources"> |
| <title>I have problems building the sources. What can I do?</title> |
| <para>Please see the file called <literal>readme-building.txt</literal> found in the source tree. |
| </para> |
| </section> |
| <!-- |
| <section id="backport-util-concurrent"> |
| <title>I get an exception about backport-util-concurrent library being required. Why is that?</title> |
| |
| <para>This exception is thrown only when running on Java 1.4 |
| without backport-util-concurrent bundle installed. |
| </para> |
| <para> |
| OSGi platform is a concurrent environment. Beans from different |
| application contexts can interact with each other creating cycles |
| between their owning contexts. This means that the backing |
| contexts have to be able to lookup and create/retrieve bean instances, |
| all at the same time, on multiple threads. A traditional synchronised |
| collection allows proper locking and thread coordination and prevents |
| race conditions, but can cause very easily deadlocks.</para> |
| |
| <para>Consider two contexts each containing two beans: <mediaobject> |
| <imageobject role="fo"> |
| <imagedata align="center" |
| fileref="src/docbkx/resources/images/deadlock.png" |
| format="PNG"/> |
| </imageobject> |
| |
| <imageobject role="html"> |
| <imagedata align="center" fileref="images/deadlock.png" |
| format="PNG"/> |
| </imageobject> |
| |
| <caption> |
| <para>Inter-application context bean interaction</para> |
| </caption> |
| </mediaobject></para> |
| |
| <para>If both bean A and C are requested by two separate threads at |
| the same time, this scenario will deadlock since each thread waits for |
| the other one to release the "bean registry" lock even just for |
| reading. However, when using a concurrent collection, reading doesn't |
| require a lock so each thread can interact with the other context |
| without waiting for a lock. Java 1.5 and upwards provide <ulink |
| url="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html">concurrent |
| collections</ulink> under <literal>java.util</literal> package. |
| However, since Java 1.4 does not, <ulink |
| url="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">backport-util-concurrent</ulink> |
| library is required.</para> |
| </section> |
| --> |
| |
| |
| <section id="logging"> |
| <title>How can I use logging in OSGi?</title> |
| |
| <para>OSGi platforms do not change the way libraries work, it just |
| enforces tighter classloading. Thus, you can, in most of the cases, |
| use the same logging strategy used in non-OSGi environments.</para> |
| |
| <para>Spring (and Gemini Blueprint) use internally the <ulink |
| url="http://commons.apache.org/logging/">commons-logging API</ulink> |
| which acts as an "ultra-thin bridge between different logging |
| implementations". In OSGi, just like in a non-OSGi environment, Spring |
| and Gemini Blueprint delegate all logging (including initialisation) to the |
| actual commons-logging API implementation.</para> |
| |
| <para>Out of the box, <ulink url="http://www.slf4j.org/">SLF4J</ulink> library is provided, which |
| shares the same purpose as commons-logging but without the |
| class loading discovery mechanism (that causes loading issues), using |
| static wiring (see the SLF4J site for more info). To use slf4j, make sure |
| you use: <literal>slf4j-api-XXX.jar</literal>, <literal>jcl104-overslf4j-XXX.jar</literal> |
| and <literal>slf4j-log4j-XXX.jar</literal> (where XXX stands for the slf4j version). |
| The last jar provides the static wiring between slf4j and log4j - if another implementation |
| is desired (such as jdk14), then a different jar is required (for the jdk14 that would be |
| slf4j-jdk14-XXX.jar) - see the official SLF4J site for more information. |
| Please see <link linkend="commons-logging">this |
| question</link > for more details on why commons-logging jar is not |
| used.</para> |
| |
| <para>Gemini Blueprint uses SLF4J on top of <ulink |
| url="http://logging.apache.org/log4j/">Log4J</ulink> but this can be |
| easily changed. As part of log4j initialisation, a |
| <literal>log4j.properties</literal> or <literal>log4j.xml</literal> |
| configuration fille needs to be present in the bundle classpath. This |
| means that the configuration file has to be part of your bundle or one |
| of its attached fragments. Besides SLF4J, for another OSGi-aware |
| solution, one can try <ulink |
| url="http://wiki.ops4j.org/dokuwiki/doku.php?id=pax:logging">Pax |
| Logging</ulink>.</para> |
| |
| <para>To learn more about log4j setup process, follow this <ulink |
| type="" |
| url="http://logging.apache.org/log4j/1.2/manual.html">link</ulink>.</para> |
| </section> |
| |
| <section id="commons-logging"> |
| <title>If you use the commons-logging API, why rely on SLF4J and |
| not the commons-logging jar?</title> |
| |
| <para>The commons-logging project provides the commons-logging API |
| (<literal>commons-logging-api-nn.jar</literal>) along with an |
| implementation (<literal>commons-logging-adapters-nn.jar</literal>) |
| that provides a wrapper between the API and the actual logging libraries |
| used underneath (such as log4j, java.util.logging, etc). However, in |
| order to determine what implementation should be used, commons-logging |
| library tries to do some classloading-based discovery that is fragile |
| and can fail unexpectedly. In an strict classloading environment such |
| as OSGi, this mechanism adds unnecessary complexity - that's why we |
| decided to use SFL4J which is not just simpler and actively maintained |
| but is also OSGi-friendly out of the box.</para> |
| |
| <para>For more information about commons-logging classloading |
| problems, see these links: <ulink |
| url="http://radio.weblogs.com/0122027/2003/08/15.html">#1</ulink> |
| <ulink |
| url="http://www.qos.ch/logging/thinkAgain.jsp">#2</ulink></para> |
| </section> |
| |
| <section id="getting-commons-logging-to-work"> |
| <title>I have to use commons-logging, what can I do?</title> |
| |
| <para>If you have to use commons-logging (for example the jar is required by certain bundles) |
| then try using the most recent version commons-logging version (1.1+) as it provides more options |
| on the discovery process. Below are some settings that can be used to make commons-logging work |
| inside an OSGi environment:</para> |
| |
| <itemizedlist> |
| <listitem> |
| <para>1.0.x</para> |
| <para> |
| Unfortunately, commons-logging 1.0.x uses the thread context class loader (TCCL) always for <ulink |
| url="http://commons.apache.org/logging/commons-logging-1.1/tech.html#A_Short_Theory_Guide_To_JCL">loading |
| loggers</ulink> implementations. Inside an OSGi environment, the TCCL is undefined and cannot be relied upon. |
| Since managing the TCCL is almost impossible as most loggers are defined as static fields that need to |
| resolved on class loading, using a different <classname>LogFactory</classname> is advised. One can use |
| the <emphasis>org.apache.commons.logging.LogFactory</emphasis> system property to specify a different |
| log factory however, the commons-logging bundle should be able to load this class.</para> |
| </listitem> |
| <listitem> |
| <para>1.1.x</para> |
| <para>If using commons logging 1.1.x, one can turn off the tccl usage through <emphasis>use_tccl</emphasis> |
| property, part of the <emphasis>commons-logging.properties</emphasis> file. |
| <ulink url="http://commons.apache.org/logging/commons-logging-1.1/troubleshooting.html"/>. Additionally, |
| 1.1.x provides several system properties (such as <emphasis>org.apache.commons.logging.Log.allowFlawedContext</emphasis>, |
| <emphasis>org.apache.commons.logging.Log.allowFlawedDiscovery</emphasis> and |
| <emphasis>org.apache.commons.logging.Log.allowFlawedHierarchy</emphasis>) that can change the behavious of the discovery process. |
| See the <ulink url="http://commons.apache.org/logging/apidocs/org/apache/commons/logging/impl/LogFactoryImpl.html">LogFactoryImpl</ulink> |
| javadoc for more details.</para> |
| </listitem> |
| </itemizedlist> |
| |
| <para>In our tests, commons logging 1.1.x can be used with reasonable success inside OSGi. We haven't been able to find a generic |
| configuration for commons logging 1.0.x that works and that does not rely on fragile hacks dependent on the running environment.</para> |
| |
| </section> |
| |
| <section id="logging-impl-choice"> |
| <title>Why don't you use the OSGi logging service/[insert your favourite |
| logging library in here]?</title> |
| |
| <para>It is completely up to you what logging implementation you want |
| Gemini Blueprint to use. To route log messages to the OSGi logging service, |
| just use a commons-logging API implementation that delegates to the |
| OSGi logging service, such as Pax Logging.</para> |
| </section> |
| |
| |
| <section id="osgi-wrapping"> |
| <title>I have to use [insert name] library/framework inside. What can I do?</title> |
| |
| <para> |
| OSGi requires JARs to contain certain <literal>MANIFEST.MF</literal> entries which indicate what classes are |
| required and shared by each archive. This means that <emphasis>tradition</emphasis> jars cannot be used inside an OSGi environment. |
| To solve the problem one can: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para>Use a repository of pre-wrapped libraries such as <ulink url="http://www.eclipse.org/orbit/">Orbit</ulink>, |
| <ulink url="http://felix.apache.org/site/apache-felix-commons.html">Felix Commons</ulink> or Knopflerfish <ulink |
| url="http://www.knopflerfish.org/repo/index.html">repository</ulink>. |
| Gemini Blueprint uses the SpringSource Enterprise <ulink url="http://www.springsource.com/repository/app/">Bundle Repository</ulink> |
| for its dependencies, which you might find useful. Additionally, for artifacts that have not yet made it into SpringSource Repository, |
| Gemini Blueprint provides a small, temporary (Amazon S3) |
| Maven repository (<ulink url="http://s3.amazonaws.com/maven.springframework.org/osgi">link</ulink> | |
| <ulink url="http://s3browse.com/explore/maven.springframework.org/osgi/">browser-friendly link</ulink>) for its internal usage.</para> |
| </listitem> |
| <listitem> |
| <para>Wrap the necessary jars with proper OSGi manifest. While this can be done by hand, we strongly recommend Peter Kriens |
| excellent <ulink url="http://www.aqute.biz/Code/Bnd">bnd</ulink> tool which can do this for you automatically. |
| For Maven, see Felix <ulink url="http://felix.apache.org/site/maven-bundle-plugin-bnd.html"> |
| maven-bundle-plugin</ulink>. |
| </para> |
| </listitem> |
| <listitem> |
| <para>Include the jar inside your OSGi bundle and include it in the bundle classpath through <emphasis>Bundle-ClassPath</emphasis> |
| directive. See the OSGi specification for more information.</para> |
| </listitem> |
| </itemizedlist> |
| </section> |
| |
| <section id="jdk-crippled-jta-api"> |
| <title>I keep getting <emphasis>java.lang.NoClassDefFoundError: javax/transaction/...</emphasis> when trying to do data access..</title> |
| |
| <para> |
| This problem is likely to be caused by bad class wiring. All 1.3+ JDKs include incomplete <emphasis>javax.transaction</emphasis> |
| and <emphasis>javax.transaction.xa</emphasis> packages for usage inside ORB environments. To address the problem, use a proper |
| JTA library which contains all the classes from the forementioned packages and exports them with a specific version to prevent |
| confusion. |
| </para> |
| <para> |
| Gemini Blueprint wraps JTA 1.1 library for OSGI environments which can be found at Spring snapshot repository. One can deploy this library |
| and specify version 1.1 for <emphasis>javax.transaction*</emphasis> packages inside <emphasis>Import-Package</emphasis> header. |
| By specifying the version, one can be sure that the proper package is used. |
| </para> |
| <para> |
| Note that JTA 1.1 is compatible with version 1.0.1. |
| </para> |
| </section> |
| |
| <section id="incomplete-osgi-jar"> |
| <title>When doing integration testing I receive <emphasis>java.lang.NoClassDefFoundError: org.osgi.vendor.framework property not set</emphasis>... </title> |
| |
| <para>Remove the official OSGi jars (osgi.jar or osgi-r4-core.jar) from the classpath and use only the actual OSGi platform (Equinox/Knopflerfish/Felix) |
| jars. The former provides only the public classes without an actual implementation and thus cannot be used during runtime, only during the compilation stage. |
| </para> |
| </section> |
| <!-- this should be part of an OSGi intro more likely --> |
| |
| <section id="auto-export-visibility"> |
| <title>The autoExport option doesn't work properly!</title> |
| |
| <para>autoExport flag, part of the service exporter, will discover and |
| include for exporting only the <emphasis>visible</emphasis> interfaces/classes implemented |
| by the service object. Consider class |
| <literal>GenericApplicationContext</literal> which implements among |
| others, interfaces <literal>BeanFactory</literal> (from |
| <literal>org.springframework.beans.factory</literal> package) and |
| <literal>ResourceLoader</literal> |
| (<literal>org.springframework.core.io</literal>).</para> |
| |
| <para> |
| <mediaobject> |
| <imageobject role="fo"> |
| <imagedata align="center" |
| fileref="src/docbkx/resources/images/visibility.png" |
| format="PNG"/> |
| </imageobject> |
| |
| <imageobject role="html"> |
| <imagedata align="center" fileref="images/visibility.png" |
| format="PNG"/> |
| </imageobject> |
| |
| <caption> |
| <para>Class Hierarchy</para> |
| </caption> |
| </mediaobject> |
| </para> |
| |
| <para>Depending on your OSGi imports, the exporting bundle can see |
| only one of the packages, none or both. Based on these visibility |
| settings, the exporter will only export the classes that are 'known' |
| to the exporting bundle. For example, if the exporting bundle sees |
| <literal>org.springframework.core.io</literal> but not |
| <literal>org.springframework.beans.factory</literal>, the service will |
| be exported as a <literal>ResourceLoader</literal> but not as a |
| <literal>BeanFactory</literal>. In fact, exporting the object as a |
| <literal>BeanFactory</literal> will fail since the bundle doesn't see |
| this interface and thus doesn't know how to handle its contract.</para> |
| </section> |
| |
| <section id="junit382-serialization"> |
| <title>When using Gemini Blueprint integration testing I get an exception about serialVersionUID. What is the problem?</title> |
| |
| <para> |
| This problem occurs on Spring DM versions up to 1.0 - consider upgrading to 1.0.1 or better. If you are stuck with 1.0 see below. |
| When running an integration test, Gemini Blueprint will duplicate the test instance and execute it inside OSGi. To avoid problems |
| like this one, make sure you are using the same libraries (with the same version) as Spring DM when running your test. This |
| particular problem for example is caused by a JUnit 3.8.2 vs 3.8.x serialization compatibility. Make sure that you are using |
| at least JUnit 3.8.2 for the execution of your tests. |
| </para> |
| </section> |
| |
| <section id="pde-errors"> |
| <title>I'm using Eclipse PDE and I started getting some weird exceptions/behaviour. What's the matter?</title> |
| |
| <para> |
| Eclipse PDE uses Equinox OSGi platform underneath which (like other OSGi platforms) caches the bundles between re-runs. When |
| the cache is not properly updated, one can encounter strange behaviour (such as the new services/code being picked up) |
| or errors ranging from class versioning to linkage. Consider doing a complete clean build or, in case of Eclipse, |
| creating a new workspace or deleting the bundle folder (depends on each project settings but most users should find it at: |
| <code>[workspace_dir]\.metadata\.plugins\org.eclipse.pde.core\OSGi\org.eclipse.osgi\bundles</code>). |
| </para> |
| </section> |
| |
| <section id="upgrade-to-1.1"> |
| <title>I'm upgrading to Spring DM 1.1 but now I get some ClassNotFoundExceptions. What has changed?</title> |
| |
| <para> |
| In Spring DM 1.1 M2, the proxy infrastructure has been refined to avoid <emphasis>type leaks</emphasis>, the usage of dynamic imports |
| or exposure of class loader chain delegation. If you encounter class visibility problems during the upgrade then it's likely you have |
| missing imports which were previously resolved as a side effect of Spring DM proxy weaving process. |
| </para> |
| </section> |
| |
| <section id="proxy-equality"> |
| <title>I've noticed that objects imported by Gemini Blueprint are not always equal to the raw target service. Why is that?</title> |
| |
| <para> |
| To deal with dynamics, Gemini Blueprint creates proxies around the imported services. The proxies are classes (generated at runtime), different |
| from the target but able to intercept the calls made to it. Since a proxy is different then its target, comparing objects against it can |
| yield different results then when the comparison is done against the target. In most scenarios this is not a problem but there might be |
| corner cases where this contract matters. Since 1.1, Gemini Blueprint importer proxies implement <interfacename>InfrastructureProxy</interfacename> |
| interface (from Spring framework) which allow access to the raw target. |
| </para> |
| </section> |
| <section id="static-collections"> |
| <title>My Gemini Blueprint collection doesn't change even though the number of OSGi service changes. What's wrong?</title> |
| |
| <para> |
| Make sure the Gemini Blueprint collections are injected into object of compatible types (for example <literal>list</literal> into |
| <interfacename>java.util.List</interfacename> or <interfacename>java.util.Collection</interfacename>). If the types are not compatible, |
| the container will have to perform |
| <ulink url="http://static.springframework.org/spring/docs/2.5.x/reference/validation.html#beans-beans-conversion">type conversion</ulink>, |
| transforming the Gemini Blueprint managed collection into a 'normal' one, unaware of the OSGi dynamics. |
| </para> |
| </section> |
| |
| <section id="update-to-1.2"> |
| <title>I have upgraded to Gemini Blueprint but my custom extender/web extender configuration doesn't work anymore. What has changed?</title> |
| |
| <para>Since Spring 2.5.6, the symbolic names of the artifacts have changed slightly. Spring DM/Gemini Blueprint aligned its symbolic names as well with the |
| new patter since Spring DM 1.2.0 M2. Thus the prefix <literal>org.springframework.bundle.osgi</literal> has been changed to |
| <literal>org.eclipse.gemini.blueprint</literal>; for example Gemini BLueprint extender symbolic name was changed from |
| <literal>org.springframework.bundle.osgi.extender</literal> to <literal>org.eclipse.gemini.blueprint.extender</literal> |
| (notice the missing <literal>bundle</literal> word). |
| To fix this problem, change the reference to the old symbolic name (usually inside the fragments manifests or LDAP filters) to the new one.</para> |
| </section> |
| <section id="linkage-error"> |
| <title>I get a <literal>java.lang.LinkageError: loader constraint violation</literal> if I use Gemini Blueprint. Things work fine with vanilla OSGi. |
| What's wrong?</title> |
| |
| <para>Most likely the bundle imports do not identify all the transitive packages dependencies (through the <emphasis>uses</emphasis> directive). Packages |
| imported from a bundle, can in turn, depend on other packages from other bundles - these are sometime called transitive or indirect dependencies. If |
| these are not properly identified, the OSGi platform cannot validate the wiring and allows multiple versions of the same class to be available inside the |
| same class space. This problem appears whether Gemini Blueprint is used or not. However, due to the usage of proxies inside Gemini Blueprint (which forces eager class loading |
| for the classes proxies), the class graph is evaluated at runtime causing the problem to occur early. With vanilla OSGi, the loading occurs lazy which means |
| the problem is going to occur at runtime rather then at startup. |
| To fix the problem, add the relevant transitive packages to the list of exported packages, either manually or automatically through tools such as |
| <ulink url="http://www.springsource.org/bundlor">Bundlor</ulink> or <ulink url="http://www.aqute.biz/Code/Bnd">Bnd</ulink>. |
| For more information on the <literal>uses</literal> directive please see the OSGi spec, |
| section 3.6.4 or <ulink url="http://blog.springsource.com/2008/10/20/understanding-the-osgi-uses-directive/">this</ulink> SpringSource blog entry. |
| </para> |
| </section> |
| |
| <section id="blueprint"> |
| <title>What can I use Gemini Blueprint with the Blueprint Container spec? What's the relationship between the two? Are the they compatible? |
| Are there any differences?</title> |
| |
| <para>Gemini Blueprint (Spring DM 2.0) is the Reference Implementation for OSGi 4.2 Blueprint Container specification. Simply deploy your Blueprint bundles in a platform |
| where Gemini Blueprint is already activated and you should be done. For more information about Blueprint and Gemini Blueprint, please see the |
| <emphasis>Blueprint Container</emphasis> chapter in the reference documentation.</para> |
| </section> |
| |
| <section id="kf-2.3-boot-delegation"> |
| <title>I'm using Knopflerfish 2.3.x and I have a lot of visibility exception. How can I fix this?</title> |
| |
| <para>Since 2.3.0, Knopflerfish changed the way it does bootpath delegation which causes classes to be loaded from inside and outside OSGi. Set |
| the system property <literal>org.knopflerfish.framework.strictbootclassloading</literal> to <literal>true</literal> before starting up the Knopflerfish |
| platform to prevent this from happening. See Knopflerfish 2.3.x release <ulink url="http://www.knopflerfish.org/release_notes_2.3.html">notes</ulink> for more |
| information.</para> |
| </section> |
| <section id="pde-cycles"> |
| <title>I'm using Gemini Blueprint and Spring jars inside Eclipse PDE but I get an error about cycle dependency errors. What's wrong?</title> |
| |
| <para>Some of the Spring jars (optionally) import each other packages for bootstrapping reasons. While cycles between jars are allowed and |
| supported by the OSGi platform, by default, Eclipse PDE complains about them. Since Eclipse Galileo, it is possible to enable binary cycles |
| in a target platform. allowing the build to compile. For more information, see |
| <ulink url="http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.pde.doc.user/guide/tools/export_wizards/export_plugins.htm">this</ulink> |
| entry from the Eclipse Reference Guide.</para> |
| </section> |
| </chapter> |
| </book> |