2010-01-20 67 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的唯一方法。