1

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

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

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

JVM从背书目录加载的代码是否无法从插件加载类?有什么办法可以启用它吗?

Java版本:1.6.0_16

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

Metro 版本:与 Glassfish 2.1 捆绑在一起

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

4

2 回答 2

1

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

于 2010-01-28T20:21:43.020 回答
0

Java SE 6 已经包含 Metro。它包括 jax-ws 2.0,因此您可以完全删除这些 jar。

仅当您有特定需要将 jax-ws 2.1 与 java SE 6 一起使用时,您可以按照此处的说明进行操作 -> https://jax-ws.dev.java.net/faq/index.html

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

于 2010-01-20T17:21:38.720 回答