Christoph Läubrich Freiberuflicher Diplom-Informatiker OSGi Supporter seit 2011

Java 6 Webservices unter eingeschränktem Bootloader nutzen

Möchte man die Java 6 internen Webservices unter einem eingeschränktem Bootloader nutzen (z.B. mit der Equinox Option osgi.compatibility.bootdelegation = false) bekommt man zunächst sehr merkwürdige Fehler beim starten des Bundles:
java.lang.IllegalArgumentException: interface com.sun.xml.internal.ws.developer.WSBindingProvider is not visible from class loader
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) 
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:630) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:331) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:313) 
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:295) 
    at javax.xml.ws.Service.getPort(Service.java:92) 

Dies scheint einer der Fälle, wo ein DynamicImport-Package angebracht ist, folgende Direktive im Manifest sollte das Problem eigentlich lösen:
DynamicImport-Package: com.sun.xml.*

Leider führt dies nicht wie gewünscht zum Erfolg: Problem ist, dass niemand dieses (interne) Sun-Package exportiert.

An dieser Stelle kommt nun die OSGi Option org.osgi.framework.system.packages.extra ins Spiel, mit ihr ist es möglich weitere Packages (welche nicht zum Default des Execution Environments gehören) vom System-Bundle exportieren zu lassen, für die Java 6 Webservices sind dies:
  • com.sun.xml.internal.ws
  • com.sun.xml.internal.ws.developer
  • com.sun.xml.internal.ws.api
  • com.sun.xml.internal.ws.api.message

Unsere fertige Direktive könnte also so aussehen (als Systemproperty beim start übergeben):
-Dorg.osgi.framework.system.packages.extra=com.sun.xml.internal.ws.developer,com.sun.xml.internal.ws,com.sun.xml.internal.ws.api,com.sun.xml.internal.ws.api.message
und schon klappt alles wie gewohnt.

Sollte der Fehler "com.sun.xml.internal.ws.model.RuntimeModelerException: A WebService annotation is not present on class" auftreten, so hat man vermutlich vergessen javax.jws.soap oder javax.xml.bind.annotation zu importieren.
Letzte Änderung 01.10.2013