Je tente d'appeler un service Web à l'aide du Metro library à partir d'une application RCP Eclipse. J'ai regroupé les bocaux Metro pertinents (webservices-tools.jar
, webservices-rt.jar
, et webservices-api.jar
) dans un plugin et fait dépendre mon plugin d'application principal de ce nouveau plugin Metro. J'ai également ajouté webservices-api.jar
à mon répertoire $JAVA_HOME/jre/lib/endorsed
. Selon le site Web de Metro, cela est nécessaire lors de l'utilisation de Metro avec Java 1.6.Problème de chargement de la classe Eclipse RCP avec Metro
Maintenant, quand j'invoque un service Web, je reçois l'erreur suivante:
javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found
at javax.xml.ws.spi.FactoryFinder.newInstance(FactoryFinder.jav a:38)
at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:133)
at javax.xml.ws.spi.Provider.provider(Provider.java:83)
at javax.xml.ws.Service.<init>(Service.java:56)
...
Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at org.eclipse.core.runtime.internal.adaptor.ContextFinder.load Class(ContextFinder.java:129)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at javax.xml.ws.spi.FactoryFinder.newInstance(FactoryFinder.jav a:34)
... 43 more
La classe com.sun.xml.ws.spi.ProviderImpl
réside dans webservices-rt.jar
, qui fait partie de mon plugin Metro. De plus, j'ai vérifié que mon code de plugin d'application peut charger cette classe, donc je ne sais pas pourquoi javax.xml.ws.spi.FactoryFinder
ne le peut pas. Puisque javax.xml.ws.spi.FactoryFinder
réside dans webservices-api.jar
(le jar que j'ai dû mettre dans le répertoire approuvé de jre), je soupçonne que cela a quelque chose à voir avec le code endossé ne pouvant pas charger les classes d'un plugin Eclipse.
Est-il vrai que le code chargé par la JVM à partir du répertoire approuvé ne peut pas charger les classes à partir des plugins? Est-il possible de le faire?
version Java: 1.6.0_16
version d'Eclipse: Eclipse IDE Java EE pour les développeurs Web Créer id: 20090920-1017 (il ne présente pas une version au-delà)
Version Metro: Livré avec Glassfish 2.1
Toute aide est grandement appréciée. Merci.
Le problème est que la version Java SE 6 de JAX-WS n'implémente pas la sécurité. J'ai essayé de supprimer les jars Metro comme vous le suggérez, auquel cas je passe l'erreur ci-dessus mais je reçois une erreur du serveur se plaignant que mon client n'a pas inclus un en-tête de sécurité (confirmant que la version JDK de JAX-WS n'implémente pas la sécurité). Je pense donc que j'ai vraiment besoin d'utiliser la version Metro de JAX-WS pour implémenter la sécurité. – Jeff
êtes-vous sûr du manque de sécurité? Le guide indique clairement que "Java SE 6 Update Release 4 et ultérieur contient déjà l'API JAX-WS 2.1 et que le travail suivant n'est plus nécessaire" – Yoni
En ce qui concerne votre modification, le site Metro indique explicitement que _only_ le webservices-api.jar devrait aller dans le répertoire approuvé, et aucun des autres pots. Néanmoins, j'ai essayé de mettre les autres pots de métro dans le répertoire approuvé. Quand je le fais, je commence à avoir des LinkageErrors étranges. En ce qui concerne le manque de sécurité, j'ai lu cela dans un autre forum en ligne. Cela ne veut pas dire que c'est vrai bien sûr, mais quand je tente de courir sans jar de métro, le client s'exécute mais n'inclut pas un en-tête de sécurité dans la requête (confirmé par l'erreur retournée par le serveur et tcpmon). – Jeff