Réalisé avec les projets Apache Felix (plateforme OSGi, felix.apache.org) et CXF (web services, etc...)...
Evidemment, ce post, valable le jour où il a été posté, devrait se périmer assez vite (en particulier en ce qui concerne les versions des outils utilisés, et leur localisation).

Le principe pourrait toutefois ne pas changer trop vite :

  • * Tout d'abord, installer puis démarrez le bundle d'extension "OSGi compendium API's", fourni avec Felix comme sous-projet (téléchargeable ici).
  • * Ensuite, installez puis démarrez le bundle OSGi CXF (cxf-dosgi-ri-singlebundle-distribution-1.1-SNAPSHOT.jar, à télécharger ici).
  • * Enfin, avant d'être installé/démarré, Le bundle OSGi que vous souhaitez exporter doit être spécifiquement "annoté" (en fait, des Properties à associer à l'enregistrement de l'interface, dans l'Activator). Ce qui permettra au bundle Apache CXF de le détecter au moment du "start", et de l'exporter sous forme de Web Service !

Donc, dans le détail :

1) Ecrire un bundle OSGi - ici, un "HelloWorld" qui exporte l'interface suivante :

package helloworld;
public interface HelloService {
  public String sayHello(String name);
}

Le bundle se compose de 3 fichiers :

- L'interface : HelloService.java

package helloworld;
public interface HelloService {
  public String sayHello(String name);
}


- L'activateur Activator.java : tout simple, mais notez les 3 lignes "props.put" (+ le passage de "props" en paramètre de registerService()) qui concernent l'exportation de l'interface sous forme de Web Service, et qui permettront au bundle CXF d'enregistrer le nouveau bundle comme web service dès qu'il sera détecté au démarrage :

package helloworld;

import java.util.Dictionary;
import java.util.Hashtable;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceEvent;

public class Activator implements BundleActivator {
  public void start(BundleContext context) {
    Dictionary props = new Hashtable();

    props.put("service.exported.interfaces", "*");
    props.put("service.exported.configs", "org.apache.cxf.ws");
    props.put("org.apache.cxf.ws.httpservice.context", "/helloworld");

    context.registerService(HelloService.class.getName(), new HelloImpl(), props);
 }

  public void stop(BundleContext context) { }

  /**
   * Implementation de l'interface HelloService
   */
  private static class HelloImpl implements HelloService {
    public String sayHello(String name) { return "Hello " + name + "!"; }
  }
}

- Le manifeste, manifest.mf :

Bundle-Name: HelloWorld
Bundle-Description: A Hello World bundle
Bundle-Vendor: Gibello
Bundle-Version: 1.0.0
Bundle-Activator: helloworld.Activator
Export-Package: helloworld
Import-Package: org.osgi.framework


Reste ensuite à créer le bundle (au préalable, faire pointer le CLASSPATH vers la librairie felix.jar - qui contient les classes d'OSGi, et se trouve dans le répertoire bin/ de felix) :

javac -d . *.java
jar cfm helloworld.jar manifest.mf helloworld/

2) Installer et démarrer les 3 bundles dans Felix :

Supposons que les 3 bundles (org.osgi.compendium-1.2.0.jar, cxf-dosgi-ri-singlebundle-distribution-1.1-SNAPSHOT.jar et helloworld.jar) soient copiés dans un sous-répertoire "my_bundles" du répertoire de felix :

  • * Démarrer Felix ( java -jar bin/felix.jar )
  • * Installer / démarrer les bundles (install ... start)
$ java -jar bin/felix.jar 

Welcome to Felix.
=================

->
-> install file:my_bundles/org.osgi.compendium-1.2.0.jar
Bundle ID: 25
-> start 25
->
-> install file:my_bundles/cxf-dosgi-ri-singlebundle-distribution-1.1-SNAPSHOT.jar
Bundle ID: 26
-> start 26
->
-> install file:my_bundles/helloworld.jar
Bundle ID: 27
-> start 27
->

3) Le web service est prêt...

Maintenant, il ne reste donc qu'à accéder au Web Service !
Par exemple, pour accéder à sa description WSDL :

http://localhost:8080/helloworld?wsdl

A noter qu'il est parfaitement possible de générer des "stubs" java pour y accéder, par exemple avec l'outil wsimport du JDK (à partir de la version 1.6) - le web service semble donc compatible avec JAX-WS.