2010-01-20 4 views
1

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.

Répondre

0

Java SE 6 comprend déjà le métro. Il comprend jax-ws 2.0, de sorte que vous pouvez supprimer complètement ces pots.

Seulement si vous avez besoin spécifique d'utiliser JAX-WS 2.1 avec Java SE 6, vous pouvez suivre les instructions ici ->https://jax-ws.dev.java.net/faq/index.html

EDIT: Vous avez raison de votre dernier commentaire. Le code placé dans le dossier approuvé est chargé avec le chargeur de classe approuvé, de sorte qu'il ne peut pas trouver les classes qui se trouvent dans les plugins. Je suggère que vous mettez tous les bocaux de métro dans le dir approuvé. De cette façon, ils seront disponibles non seulement pour votre plug-in, mais pour l'ensemble de la machine virtuelle.

+0

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

+0

ê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

+0

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

1

Pour tous ceux qui rencontrent ce problème, j'ai été capable de trouver une solution. J'ai ajouté les pots de métro, ainsi que le répertoire de configuration contenant mes fichiers de configuration WSIT, au classpath de démarrage de la machine virtuelle Java en utilisant ces options JVM:

-Xbootclasspath/a:./lib/webservices-api.jar 
-Xbootclasspath/a:./lib/webservices-rt.jar 
-Xbootclasspath/a:./lib/webservices-tools.jar 
-Xbootclasspath/a:./config 

Le webservices-api.jar n'a plus besoin d'être $JAVA_HOME/jre/lib/endorsed pour que cela fonctionne. Ce n'est certainement pas le modèle Eclipse normal, mais c'est le seul moyen que j'ai trouvé pour utiliser Metro dans une application Eclipse RCP avec Java 1.6.

Questions connexes