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:
Dies scheint einer der Fälle, wo ein DynamicImport-Package angebracht ist, folgende Direktive im Manifest sollte das Problem eigentlich lösen:
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:
Unsere fertige Direktive könnte also so aussehen (als Systemproperty beim start übergeben):
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.
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.messageund 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.