36.5. Deploy to an OSGi Container
One of the options for deploying the WS client is to package it as an OSGi bundle and deploy it into an OSGi container such as Red Hat JBoss Fuse. Some of the advantages of an OSGi deployment include:
- Bundles are a relatively lightweight deployment option (because dependencies can be shared between deployed bundles).
- OSGi provides sophisticated dependency management, ensuring that only version-consistent dependencies are added to the bundle's classpath.
Using the Maven bundle plug-in
The Maven bundle plug-in is used to package your project as an OSGi bundle, in preparation for deployment into the OSGi container. There are two essential modifications to make to your project's
- Change the packaging type to
bundle(by editing the value of the
project/packagingelement in the POM).
- Add the Maven bundle plug-in to your POM file and configure it as appropriate.
Configuring the Maven bundle plug-in is quite a technical task (although the default settings are often adequate). For full details of how to customize the plug-in configuration, consult Deploying into the OSGi Container and Managing OSGi Dependencies.
Sample bundle plug-in configuration
The following POM fragment shows a sample configuration of the Maven bundle plug-in, which is appropriate for the current example.
<?xml version="1.0"?> <project ...> ... <groupId>com.fusesource.byexample.cxf-webinars</groupId> <artifactId>customer-ws-client</artifactId> <name>customer-ws-client</name> <packaging>bundle</packaging> ... <build> <plugins> ... <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> !com.fusesource.customer.client, !com.fusesource.demo.customer, !com.fusesource.demo.wsdl.customerservice </Export-Package> <Import-Package> * </Import-Package> <DynamicImport-Package> org.apache.cxf.*, org.springframework.beans.* </DynamicImport-Package> </instructions> </configuration> </plugin> ... </plugins> </build> </project>
The Java packages from Apache CXF and the Spring API are imported using dynamic imports (specified using the
DynamicImport-Packageelement). This is a pragmatic way of dealing with the fact that Spring XML files are not terribly well integrated with the Maven bundle plug-in. At build time, the Maven bundle plug-in is not able to figure out which Java classes are required by the Spring XML code. By listing wildcarded package names in the
DynamicImport-Packageelement, however, you allow the OSGi container to figure out which Java classes are needed by the Spring XML code at run time.
In general, using
DynamicImport-Packageheaders is not recommended in OSGi, because it short-circuits OSGi version checking. Normally, what should happen is that the Maven bundle plug-in lists the Java packages used at build time, along with their versions, in the
Import-Packageheader. At deploy time, the OSGi container then checks that the available Java packages are compatible with the build time versions listed in the
Import-Packageheader. With dynamic imports, this version checking cannot be performed.
Build and deploy the client bundle
After you have configured the POM file, you can build the Maven project and install it in your local repository by entering the following command:
To deploy the client bundle, enter the following command at the containers command console:
karaf@root> install -s mvn:com.fusesource.byexample.cxf-webinars/customer-ws-client
If your local Maven repository is stored in a non-standard location, you might need to customize the value of the
org.ops4j.pax.url.mvn.localRepositoryproperty in the
EsbInstallDir/etc/org.ops4j.pax.url.mvn.cfgfile, before you can use the
mvn:scheme to access Maven artifacts.
Check that the client is running
Assuming that you have already deployed the corresponding Web service into the OSGi container, you can verify that the client is successfully invoking WSDL operations by checking the log, as follows:
karaf@root> log:display -n 10
The client invokes an operation on the Web service once every second.