Я пытаюсь вызвать веб-службу с помощью библиотеки Metro из приложения Eclipse RCP. Я объединил соответствующие файлы Metro jar (webservices-tools.jar, webservices-rt.jar и webservices-api.jar) в подключаемый модуль и сделал основной подключаемый модуль приложения зависимым от этого нового подключаемого модуля Metro.

Я также добавил webservices-api.jar в свой каталог $JAVA_HOME/jre/lib/endorsed. Согласно веб-сайту Metro, это необходимо при использовании Metro с Java 1.6.

Теперь, когда я вызываю любую веб-службу, я получаю следующую ошибку:

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), я подозреваю, что это как-то связано с одобренным кодом, который не может загружать классы из плагина Eclipse.

Это тот случай, когда код, загруженный JVM из одобренного каталога, не может загружать классы из плагинов? Есть ли способ включить это?

Версия Java: 1.6.0_16

Версия Eclipse: Eclipse Java EE IDE для веб-разработчиков Идентификатор сборки: 20090920-1017 (другая версия не отображается)

Metro-версия: в комплекте с Glassfish 2.1

Любая помощь приветствуется. Спасибо.

1
Jeff 20 Янв 2010 в 20:11

2 ответа

Для всех, кто сталкивается с этой проблемой, я смог найти решение. Я добавил jar-файлы метро вместе с каталогом конфигурации, содержащим мои файлы конфигурации wsit, в путь к классам загрузки 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, но это единственный способ использовать Metro в RCP-приложении Eclipse с Java 1.6.

1
Shadow Wizard Hates Omicron 6 Сен 2011 в 18:31

Java SE 6 уже включает метро. Он включает jax-ws 2.0, поэтому вы можете полностью удалить эти банки.

Только если у вас есть особая необходимость использовать jax-ws 2.1 вместе с java SE 6, вы можете следовать инструкциям здесь -> https://jax-ws.dev.java.net/faq/index.html

РЕДАКТИРОВАТЬ: Вы правы в своем последнем комментарии. Код, помещенный в одобренную папку, загружается одобренным загрузчиком классов, поэтому он не может найти классы, расположенные в надстройках. Я предлагаю вам поместить все банки метро в одобренный каталог. Таким образом, они будут доступны не только для вашего плагина, но и для всей ВМ.

0
Yoni 20 Янв 2010 в 20:43
Проблема в том, что версия JAX-WS для Java SE 6 не обеспечивает безопасность. Я попытался удалить jar-файлы метро, ​​как вы предлагаете, и в этом случае я получаю сообщение об ошибке, описанное выше, но затем я получаю сообщение об ошибке с сервера, жалующееся на то, что мой клиент не включает заголовок безопасности (подтверждая, что JDK-версия JAX-WS не обеспечивает безопасность). Поэтому я думаю, что мне действительно нужно использовать версию JAX-WS для Metro, чтобы реализовать безопасность.
 – 
Jeff
20 Янв 2010 в 20:31
Вы уверены в отсутствии безопасности? В руководстве четко сказано: «Java SE 6 Update Release 4 и более поздние версии уже содержат API JAX-WS 2.1, и следующий обходной путь больше не нужен»
 – 
Yoni
20 Янв 2010 в 20:46
Что касается вашего редактирования, на сайте Metro прямо указано, что только файл webservices-api.jar должен находиться в одобренном каталоге, и ни один из других jar-файлов. Тем не менее, я попытался поместить другие банки метро в одобренный каталог. Когда я это делаю, я начинаю получать странные ошибки LinkageErrors. Что касается отсутствия безопасности, я прочитал это на другом онлайн-форуме. Это, конечно, не означает, что это правда, но когда я пытаюсь запустить без каких-либо Metro jar, клиент запускается, но не включает заголовок безопасности в запрос (подтверждается ошибкой, возвращаемой сервером и tcpmon).
 – 
Jeff
20 Янв 2010 в 21:38