Как я могу представить плагины Eclipse как веб-сервисы? - PullRequest
1 голос
/ 02 декабря 2011

Я занимался исследованием выставления плагинов Eclipse в качестве веб-сервисов, но я запутался.

Мое требование в основном состоит в создании серверной части Equinox для набора веб-сервисов.Я буду интенсивно использовать EMF и связанные с ним проекты, поэтому с этой целью я читал об Equinox / OSGI и вариантах создания того, что мне нужно.

Однако есть некоторые загадочные моменты и вообще множество проектов вокруг.Учитывая выводы ниже, я хотел бы услышать ваши предложения.Может быть, есть вариант, который мне не хватает, или, может быть, вы сделали это раньше.Вот номинанты (барабанная дробь)

Хостинг Equinox в веб-контейнере.Используя bridge.war, плагины могут предоставлять сервлет.Проблема в том, что для использования хороших REST-фреймворков, таких как RestEasy (мой любимый), REST-фреймворк должен быть пакетом osgi, который будет жить во время выполнения Equionox.Я провел 3 дня, и из-за проблем с загрузчиком классов, это не работает.Теперь я убежден, что я не смогу получить RestEasy в Равноденствие.Я могу использовать RestEasy в веб-контейнере и использовать сериализацию / десериализацию XML, чтобы заставить код в веб-контейнере взаимодействовать с кодом в Equionox, но это кажется пустой тратой ресурсов.Тем не менее, это может сработать.

Другой вариант - ECF, представляющий собой реализацию распределенного OSGI, который поддерживает SOAP / Rest.Тем не менее, я не смог найти четкого учебника, который бы просто представлял размещенную функциональность Equinox как веб-сервис.Так что это по-прежнему вынуждает меня не использовать RestEasy, но, по крайней мере, это дает мне подходящую основу для общения с Equinox.Я, вероятно, все еще должен держать это в веб-контроллере для масштабируемости.

Затем есть Eclipse Virgo, который, кажется, поддерживает хостинг веб-приложений наряду со временем выполнения OSGI, и, очевидно, размещенный в веб-контейнере код может взаимодействовать с кодом времени выполнения OSGI.Тем не менее, я не уверен, что смогу обойти классы, поскольку аннотированный Jaxb тип A, созданный в веб-контейнере, скорее всего, использует загрузчик классов другой сети, чем плагин времени выполнения OSGI.Кроме того, эта установка блокирует меня в Деве, и я предпочел бы пойти с JBoss и т. Д. Для производственного использования.

Итак, учитывая эти параметры и, возможно, больше, о которых я сейчас не знаю, как бы вы представили EMF и другие основанные на платформе Eclipse проекты в качестве веб-сервисов?

Редактировать: основанные наответ я хотел бы добавить больше.Частично детали вопроса, частично комментарии, которые не вписываются в раздел комментариев.

Мои исследования после вопроса позволили мне точно сказать, с каким ответом я согласился: Apache CXF теперь является реализацией Distributed OSGI, и это хорошо.Я отказался от RestEasy.Моя текущая проблема - у меня уже есть XSD, который создал мои классы.RestEasy сделал это очень легко разоблачить, и я должен был бы сделать то же самое здесь.Мои плагины должны будут использовать эти классы на основе JAXB.В худшем случае я могу попытаться использовать проект Eclipse Link, который предлагает поддержку JAXB, для создания содержимого XML и передать его либо через базовое использование сервлета, либо в виде строковых значений на основе CXF.Поэтому решения, обсуждаемые здесь, не кажутся идеальными, но я думаю, что это лучшее, что можно сделать на данный момент.

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

К сожалению, я думаю, что проблема здесь в RESTeasy.В соответствии с вашим комментарием к другому вопросу, RESTeasy использует API-интерфейс Java ServiceLoader для динамического поиска классов, что, к сожалению, делает предположения о загрузке классов, которые не соответствуют ни одной неплоской (т.е. модульной) архитектуре загрузки классов.спросить на форумах RESTeasy об альтернативах подходу ServiceLoader для поиска этих классов.Может быть возможно явно зарегистрировать эти классы, например.

Однако, не имея решения, позволяющего продолжить использование RESTeasy, существуют альтернативные API REST, которые очень хорошо работают в OSGi.Restlet, например, имеет явную поддержку OSGi.Я также успешно использовал Джерси.

1 голос
/ 02 декабря 2011

Я работаю над продуктом, который сделал это. У нас есть Равноденствие внутри веб-контейнера. Мы предоставляем SOAP и REST веб-сервисы, используя Apache CXF. Потребовалось немного черной магии, чтобы все было правильно подключено. Я обнаружил, что документация CXF не так уж велика, особенно для OSGI.

Как я уверен, вы знаете, размещение Equinox в веб-контейнере не рекомендуется, хотя его трудно избежать, если вы хотите использовать OSGI. Мы тоже столкнулись с рядом проблем с загрузкой классов. На самом деле мы никогда не пользовались рекламируемыми преимуществами OSGI (модульность и т. Д.). Нам уже поздно возвращаться. OSGI не следует вводить слегка.

Итак, вот краткий обзор того, как мы включили SOAP / REST с использованием CXF. Надеюсь, это, по крайней мере, укажет вам правильное направление.

1) Установите CXF OSGI-комплекты, как основные, так и DOSGI - мы используем следующее: CXF-пачке минимал-2.2.12.jar CXF-dosgi-ри-открытие-местный 1.1.jar CXF-dosgi-ри-Д-CXF-1.1.jar Ссылки: http://cxf.apache.org/download.html

2) Установите API JAX-RS (REST) ​​и JAX-WS (SOAP) -Определение API находится в org.apache.servicemix.specs.jsr311-api-1.0-1.3.0.jar и org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar (это версии у нас есть) -Это может или не может быть в комплекте с CXF. В нашем случае была включена только банка JAX-WS. Нам пришлось охотиться за комплектом JAX-RS. -В дополнение к установке пакетов в веб-приложении (WEB-INF / eclipse / plugins), нам также пришлось добавить их в каталог ECLIPSE / plugins для компиляции.

3) Скажите Equinox, чтобы загрузить плагины CXF. Возможно, есть и другие способы сделать это. Мы сделали это с помощью записей в WEB-INF / eclipse / configuration / config.ini. -Если этот файл существует, добавьте ваши новые файлы jar в свойство osgi.bundles: osgi.bundles = ... org.apache.servicemix.specs.jaxb-api-2.1-1.1.1.jar@start, org.apache.servicemix.specs.jaxws-api-2.1-1.1.1.jar@start , org.apache.servicemix.specs.jsr311-api-1.0-1.3.0.jar@start, \ cxf-dosgi-ri-discovery-local-1.1.jar@5: start, \ cxf-bundle-minimal-2.2.12.jar@5: start, \ cxf-dosgi-ri-dsw-cxf-1.1.jar@5: старт

4) Вот и все. Теперь вы сможете начать писать сервисы SOAP и REST. Это Java-первый подход (в отличие от XML-схемы в первую очередь). Это означает, что вы: Определить интерфейс Java -Настройка CXF для публикации вашего интерфейса как конечной точки REST или SOAP.

Вот очень простой пример для REST. Он поставляется со стандартным отказом от ответственности, что это специфично для нашей среды YMMV.

a) Мы используем декларативные сервисы, поэтому сначала мы определяем файл DS в манифесте нашего пакета. Сервисный компонент: META-INF / ds / helloworld.xml б) Вот файл DS: META-INF / ds / helloworld.xml. Файл DS определяет службы в вашем комплекте OSGI и их зависимости. Эти записи были опущены для краткости.

<?xml version="1.0"?>
<components xmlns="http://www.osgi.org/xmlns/scr/v1.0.0">

<component name="hello_world_service" xmlns="http://www.osgi.org/xmlns/scr/v1.0.0">

   <!-- Defines this as a REST service --->
   <property name="service.exported.configs" value="org.apache.cxf.rs"/>
   <!-- This is the URI of your REST resource.  
    It is realtive to the Equinox bridge servlet in your webapp -->
   <property name="org.apache.cxf.rs.httpservice.context" value="/helloworld" /> 
   <!-- This is the java interace that will be exposed .  You
   will use JAX-RS annotations to map these java methods to HTTP verbs. -->  
   <property name="service.exported.interfaces" value="com.foo.IHelloWorldService"/>        
... 

</components>

в) Вот интерфейс класса:

package com.foo;

@Path("/greeting")
public Interface IHelloWorldService {

   @GET
   @Produces("application/xml")
   public Greeting getGreeting();

}

public class HelloWorldService implements IHelloWorldService {
   @override
   public Greeting getGreeting() {
      Greeting g = new Greeting();
      g.message = "Hello World";
      return g;
   }
}

d) Итак, когда все это будет готово, вы сможете получить следующий URL:

   /<web-app-name>/bridge/helloworld/greeting

и получите следующий ответ:

   <Greeting>
      <message>Hello World</message>
   </Greeting>

Удачи. Надеюсь, это поможет.

...