2013-07-04 4 views
2

Я пытаюсь встроить рамки Equinox над 6.1 сервера в Websphere, но после попытки почти все, что я думаю, что мне нужна помощь.Встраивание Equinox 3.2.1 в WebSphere

Основная проблема заключается в том, что я не могу импортировать какие-либо фреймворки, которые я хочу в свой проект (новые Equinox, Apache Felix и т. Д.). Когда я это делаю, я получаю множество исключений, которые говорят мне, что загруженный класс не те, которые я хочу (ClassNotFoundException, MethodNotFoundException и т. Д.).

Так я узнал, что мне нужно использовать определенную версию (org.eclipse.osgi_3.2.1.R32x_v20060919.jar), который поставляется с Websphere. Проблема: я не знаю, как получить BundleContext.

Что я пробовал:

  1. Использование ServiceLoader класс:

    FrameworkFactory ff = ServiceLoader.load(FrameworkFactory.class); 
    

    Результат: Мне нужно использовать Java 1.5, которая не имеет класс ServiceLoader.

  2. Использование EclipseStarter класса для запуска рамки:

    BundleContext context = EclipseStarter.startup(new String[]{},null); 
    

    Результат: Выдает исключение, говоря, что Eclipse, уже работает.

  3. Использование EclipseStarter получить контекст системы расслоение:

    BundleContext context = EclipseStarter.getSystemBundleContext(); 
    

    Результат: Метод не реализован на этой версии.

  4. Используя EquinoxFactory класс:

    Framework fw = new EquinoxFactory().newFramework(...); 
    

    Результат: Моя версия Equinox не имеет реализации EquinoxFactory класса.

Я не знаю, что еще попробовать. Я не могу найти много документации об этой версии, и почти все, что я нахожу, касается использования консоли, а не внедрения фреймворка.

Если я получаю это право, мы будем избегать того, чтобы начать новый JVM только для создания PDF (мы пытаемся использовать несколько версий Apache FOP)

Спасибо.

ответ

0

Если вы не можете использовать ServiceLoader, то вы можете просто непосредственно экземпляр реализации равноденствия FrameworkFactory, который org.eclipse.osgi.launch.EquinoxFactory (как показано чтение META-INF/services запись кувшина Equinox).

Для получения дополнительной информации о встраивании OSGi см сообщение в блоге я написал некоторое время назад: http://njbartlett.name/2011/03/07/embedding-osgi.html

+0

Я также помню, как пытался этот вариант, но в банке даже нет класса «FrameworkFactory». –

+0

... добавление вашего предложения в список попыток (номер 4) –

+0

О, вы используете Equinox 3.2 Знаете, вам около 9 лет, правильно? Вам нужно использовать хотя бы что-то вроде версии 3.5 для поддержки OSGi Release 4.2. –

1

Начиная с версии 6.1, сам WebSphere работает на равноденствия. Ваше описание проблемы указывает на то, что ваш код фактически не пытается создать встроенный контейнер Equinox, но вместо этого взаимодействует с контейнером Equinox от WebSphere. Вероятная причина заключается в том, что загрузчики классов вашего приложения используют основной режим делегирования по умолчанию. Первое, что вам нужно сделать, - настроить их для использования режима «родительский», чтобы ваше приложение стало изолированным от кода Equinox в WebSphere. Это также устранит ограничение на тип и версию контейнера OSGi, который вы можете использовать.

+0

Очень возможно, что то, что вы говорите, может решить проблему. Проблема в том, что изменить это поведение невозможно, поскольку результаты могут быть непредсказуемыми для других разделов приложения. Глупый вопрос: поскольку WebSphere работает на Equinox (я полагаю, это сам Bundle), есть возможность загрузить мои собственные пакеты вместе и использовать их, скажем, сервлет ?. –

+0

В теории это возможно, но я бы настоятельно рекомендовал НЕ делать это. Беспокойство с временем выполнения сервера для решения проблемы в приложении не является хорошей идеей, и если у вас есть администраторы/инженеры/архитекторы WebSphere, которые серьезно относятся к своей работе, они не позволят вам это сделать. –

1

Если вы можете перейти на WebSphere 7, вы можете установить OSGi Applications Feature Pack. Это позволит вам использовать модель программирования Enterprise OSGi; например, вы могли бы использовать Blueprint для вставки контекста пакета, или вы могли бы пойти дальше и использовать Blueprint для декларативного выполнения многих вещей, которые вы обычно делаете с контекстом связки в любом случае. Если вы можете перейти в WebSphere 8.5.5 Liberty Profile, вы можете установить произвольные пакеты в сам сервер как расширения (user features, а также установить приложения OSGi. Однако для обоих этих решений требуется обновление инфраструктуры, что не похоже на вы можете сделать.