使用Metro的Eclipse RCP类加载问题

时间:2010-01-20 17:11:03

标签: java eclipse-rcp java-metro-framework

我正在尝试使用Eclipse RCP应用程序中的Metro library来调用Web服务。我将相关的Metro jar(webservices-tools.jarwebservices-rt.jarwebservices-api.jar)捆绑到一个插件中,并使我的主应用程序插件依赖于这个新的Metro插件。

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

现在,当我调用任何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,这是我的Metro插件的一部分。此外,我已经验证我的应用程序插件代码可以成功加载此类,因此我不确定为什么javax.xml.ws.spi.FactoryFinder不能。

由于javax.xml.ws.spi.FactoryFinder位于webservices-api.jar(我必须放入jre的背书目录中的jar),我怀疑这与已批准的代码无法从Eclipse加载类有关插件。

JVM从被支持的目录加载的代码是否无法从插件中加载类?有没有办法启用它?

Java版本:1.6.0_16

Eclipse版本:面向Web开发人员的Eclipse Java EE IDE构建ID:20090920-1017(除此之外不显示版本)

Metro版:与Glassfish 2.1捆绑在一起

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

对于遇到此问题的其他人,我能够找到解决方案。我使用这些JVM选项将Metro jar和包含我的wsit配置文件的config目录添加到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的唯一方法。

答案 1 :(得分:0)

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

只有当您特别需要将jax-ws 2.1与java SE 6一起使用时,您才能按照此处的说明进行操作 - &gt; https://jax-ws.dev.java.net/faq/index.html

编辑:你对自己的最后评论是正确的。放置在endorsed文件夹中的代码加载了认可的类加载器,因此无法找到插件中的类。我建议你把所有的地铁罐放在背书的目录里。这样,它们不仅可用于您的插件,还可用于整个VM。