Я пытаюсь вызвать веб-службу с помощью библиотеки 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
Любая помощь приветствуется. Спасибо.
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.
Java SE 6 уже включает метро. Он включает jax-ws 2.0, поэтому вы можете полностью удалить эти банки.
Только если у вас есть особая необходимость использовать jax-ws 2.1 вместе с java SE 6, вы можете следовать инструкциям здесь -> https://jax-ws.dev.java.net/faq/index.html
РЕДАКТИРОВАТЬ: Вы правы в своем последнем комментарии. Код, помещенный в одобренную папку, загружается одобренным загрузчиком классов, поэтому он не может найти классы, расположенные в надстройках. Я предлагаю вам поместить все банки метро в одобренный каталог. Таким образом, они будут доступны не только для вашего плагина, но и для всей ВМ.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.