Need to detail the various ways the Tuscany runtime loads classes and the issues involved. Here are some notes to kick of this document Classloading ObjectivesThe runtime must work in both OSGi and non-OSGI environments. I.e. we can't rely on the OSGi service registry for extensibility General PatternsExtension loading - JSEtuscany-extensibility Extension loading - OSGituscany-extensibility-equinox The tuscany-extensibility-equinox bundle also has a dynamic import DynamicImport-Package: org.apache.tuscany.sca.extensibility.equinox, Which allows it to generally load any classes in the runtime Split PackagesThird-party libraries - JSETBD Third-party libraries - OSGIThird-party libraries often rely on TCCL to load implementation classes in an extensible way. For example, the SDO API loads the HelperContext implementation in this way. In an OSGi environment there will not be a static dependency between the api bundle and the impl bundle so we need to fake it. Typically we do this by setting up the TCCL appropriately before the library us called. See ClassLoaderContext which help us to set up a multi-classloader configurations. Typically in OSGi one of the classloaders we pass in here will be the extensibiliy-equinox bundle classloader (the ServiceDiscoverer) as this bundles has a dynamic import which allows it to load any class in the runtime. Tuscany Node API - JSETBD Tuscany Node API - OSGiThere are a small number of Tuscany Jars you need to use in the app launcher in the OSGi environment tuscany-sca-api The node API has to load the node implementation and has a dynamic import in its manifest DynamicImport-Package: org.apache.tuscany.sca.node.impl,org.apache.tuscany.sca.extensibility SCA Client API - JSEFactory finder impl is injected into the API class by the implementation SCA Client API - OSGiNodeFactory maintains a NodeProxy inner class that supports cross-classloader calls. The calling client api will have been loaded by the app classloader but the underlying node will have been loaded by a bundle classloader. We need to bridge that gap. |