2010-01-20 5 views
1

Eclipse RCP 응용 프로그램 내에서 Metro library을 사용하여 웹 서비스를 호출하려고합니다. 필자는 관련 메트로 항아리 (webservices-tools.jar, webservices-rt.jarwebservices-api.jar)를 플러그인에 묶어 주었고 내 기본 애플리케이션 플러그인을이 새로운 Metro 플러그인에 의존하게 만들었습니다.Metro에서 Eclipse RCP 클래스 로딩 문제

또한 을 내 $JAVA_HOME/jre/lib/endorsed 디렉토리에 추가했습니다. Metro 웹 사이트에 따르면 Java 1.6과 함께 Metro를 사용할 때 필요합니다.

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.ProviderImplwebservices-rt.jar에있는 클래스 내 지하철 플러그인의 일부입니다 : 내가 어떤 웹 서비스를 호출 할 때

지금, 나는 다음과 같은 오류가 발생합니다. 또한, 내 응용 프로그램 플러그인 코드가이 클래스를 성공적으로로드 할 수 있는지 확인 했으므로 javax.xml.ws.spi.FactoryFinder을 사용할 수없는 이유를 모르겠습니다.

javax.xml.ws.spi.FactoryFinderwebservices-api.jar (jre의 승인 된 디렉토리에 넣은 항아리)에 있기 때문에 Eclipse 플러그인에서 클래스를로드 할 수없는 승인 된 코드와 관련이 있다고 생각합니다.

승인 된 디렉토리의 JVM에서로드 한 코드가 플러그인의 클래스를로드 할 수없는 경우가 있습니까? 이 방법을 사용할 수 있습니까?

Java 버전 : 1.6.0_16

이클립스 버전 : 이클립스 자바 EE IDE 웹 개발자 ID를 빌드 : 20090920-1017이

메트로 버전 (그것은 그 이상 버전을 표시하지 않습니다) : 번들 글래스 피시 2.1

도움을 주시면 대단히 감사하겠습니다. 감사.

답변

0

Java SE 6에는 이미 메트로가 포함되어 있습니다. jax-ws 2.0이 포함되어있어이 jar를 완전히 제거 할 수 있습니다.

당신이 SE 6 자바와 함께 JAX-WS 2.1을 사용하는 특정 필요성이있는 경우에만, 여기의 지침을 따를 수 있습니다 ->https://jax-ws.dev.java.net/faq/index.html

편집 : 당신은 당신의 마지막 코멘트에 대한 권리입니다. 승인 된 폴더에 배치 된 코드는 승인 된 클래스 로더와 함께로드되므로 플러그인에있는 클래스를 찾을 수 없습니다. 나는 모든 지하철 항아리를 승인 된 직위에 두는 것이 좋습니다. 이 방법으로 플러그인을 사용할 수있을뿐만 아니라 전체 VM에서도 사용할 수 있습니다.

+0

JAX-WS의 Java SE 6 버전은 보안을 구현하지 않는다는 문제점이 있습니다. 내가 제안한대로 메트로 항아리를 제거하려고했는데, 위의 경우를 지나면 오류가 발생하지만 내 클라이언트가 보안 헤더를 포함하지 않는다는 오류 메시지가 나타납니다 (JAX-WS의 JDK 버전 보안을 구현하지 않음). 그래서 보안을 구현하기 위해 실제로 JAX-WS의 Metro 버전을 사용해야한다고 생각합니다. – Jeff

+0

보안 부족에 대한 확신이 있으십니까? 가이드에는 "Java SE 6 Update Release 4 이상에는 이미 JAX-WS 2.1 API가 포함되어 있으며 더 이상 다음 작업은 더 이상 필요하지 않습니다." – Yoni

+0

편집과 관련하여 Metro 사이트는 _only_ webservices-api.jar이 지지가 된 디렉토리로 들어가고, 다른 항아리는 없다. 그럼에도 불구하고 다른 지하철 항아리를 승인 된 디렉토리에 넣어 보았습니다. 내가 할 때 이상한 LinkageErrors가 생기기 시작합니다. 보안 부족에 대해서는 다른 온라인 포럼에서 읽었습니다. 그렇다고해서 당연한 것은 아니지만 메트로 항아리없이 실행하려고하면 클라이언트가 실행되지만 요청에 보안 헤더가 포함되지 않습니다 (서버 및 tcpmon에서 반환 된 오류로 확인 됨). – Jeff

1

이 문제를 겪는 다른 모든 사람들에게 해결책을 찾을 수있었습니다. 나는이 JVM 옵션을 사용하여 JVM의 부트 클래스 패스 내 WSIT 구성 파일이 포함 된 config 디렉토리와 함께 지하철 항아리를 추가하지 :

-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를 사용하는 유일한 방법입니다.