2010-01-20 72 views
1

我试图调用使用Metro library从Eclipse RCP应用程序中的Web服务Eclipse RCP的类加载问题。我捆起相关地铁罐子(webservices-tools.jarwebservices-rt.jarwebservices-api.jar)成一个插件,使我的主要应用插件依赖于这个新的地铁插件。与地铁

我还添加了webservices-api.jar$JAVA_HOME/jre/lib/endorsed目录。根据Metro网站的说法,当在Java 1.6中使用Metro时,这是必需的。

现在,当我调用任何Web服务,我得到以下错误:

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 

com.sun.xml.ws.spi.ProviderImpl位于webservices-rt.jar,这是我的地铁插件的一部分。此外,我已验证我的应用程序插件代码可以成功加载此类,所以我不确定为什么javax.xml.ws.spi.FactoryFinder不能。由于javax.xml.ws.spi.FactoryFinder驻留在webservices-api.jar(我不得不放在jre的背书目录中),我怀疑这与代码不能从Eclipse插件加载类有关。

是指从endorsed目录通过JVM加载代码不能从插件加载类的情况?有什么办法可以启用它吗?

Java版本:1.6.0_16

Eclipse版本:Eclipse的Java EE的IDE为Web开发人员建立ID:20090920-1017(它不会显示一个版本超出)

Metro版:捆绑Glassfish的2.1

任何帮助是极大的赞赏。谢谢。

回答

0

Java SE 6已经包含了地铁。它包括jax-ws 2.0,所以你可以完全删除这些罐子。

只有当你有特殊需要与Java使用JAX-WS 2.1一起SE 6,你可以按照下列指示 - >https://jax-ws.dev.java.net/faq/index.html

编辑:你说得对你最后的评论。放在背书文件夹中的代码使用背书类加载器加载,所以它找不到位于插件中的类。我建议你把所有的地铁罐放在背书的目录中。这样,它们不仅适用于您的插件,而且适用于整个虚拟机。

+0

问题是Java SE 6版本的JAX-WS没有实现安全性。我试图根据你的建议去除地铁罐,在这种情况下,我通过了上面的错误,但后来从服务器收到一个错误,抱怨我的客户端没有包含安全头(确认JDK版本的JAX-WS不实施安全)。 所以我想我真的需要使用Metro版本的JAX-WS来实现安全性。 – Jeff 2010-01-20 17:31:09

+0

你确定缺乏安全性吗?该指南明确指出“Java SE 6 Update Release 4及更高版本已经包含JAX-WS 2.1 API,并且不再需要以下解决方法” – Yoni 2010-01-20 17:46:54

+0

关于您的编辑,Metro站点明确声明_only_ webservices-api.jar应该进入背书目录,并没有其他的罐子。尽管如此,我确实尝试将其他地铁罐放在支持的目录中。当我这样做,我开始得到奇怪的LinkageErrors。 关于缺乏安全性,我在另一个在线论坛上阅读。这并不意味着它当然是真的,但是当我尝试运行没有任何地铁瓶罐时,客户端运行但在请求中不包含安全标头(由服务器和tcpmon返回的错误确认)。 – Jeff 2010-01-20 18:38:40

1

对于其他人谁运行到这个问题,我能够找到一个解决方案。我加了地铁罐子,包含我的WSIT配置文件config目录下沿,在JVM的引导类路径使用这些JVM选项:

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

webservices-api.jar不再需要在$JAVA_HOME/jre/lib/endorsed这个工作。这当然不是普通的Eclipse模型,但这是我发现在Java 1.6的Eclipse RCP应用程序中使用Metro的唯一方法。