Использование пакета OSGi из веб-приложения Java в Tomcat - PullRequest
15 голосов
/ 31 августа 2011

Я пытаюсь вызвать метод комплекта OSGi из веб-приложения Java.Оба должны работать на Tomcat 7.

Я уже написал нормальное Java-приложение, которое вызывает методы из пакета OSGi, как описано на этом сайте: http://drupal.osgibook.org/node/37.

Чтобы получитьконтекст среды Equinox Я запустил его из приложения и установил пакеты изнутри.Кроме того, контекст использовался для получения ссылки на службу запущенного пакета и получения его службы.

Метод runEquinox класса EquinoxRunner:

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;

public BundleContext runEquinox([...]) throws Exception {
    [...]

    BundleContext bundleContext = EclipseStarter.startup(new String[]{"-console"}, null);
    bundleContext.installBundle("file:C:/.../plugins/myosgiclass.interface_1.0.0.201108301327.jar");
    Bundle bundleTranslationImpl =  bundleContext.installBundle("file:C:/.../plugins/myosgiclass.impl_1.0.0.201108301327.jar");
    bundleTranslationImpl.start();

    [...]
    return bundleContext;
}

и invokeMethod класса ServiceRunner:

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

[...]

public Object invokeMethod(BundleContext bundleContext, Object value, [...]){
    ServiceReference serviceReference = bundleContext.getServiceReference(MyOSGiClass.class.getName());
    Object result = null;
    if (serviceReference != null) {
        MyOSGiClass myOSGiClass = (MyOSGiClass) bundleContext.getService(serviceReference);
        if (myOSGiClass != null) result = myOSGiClass.method(value);
        bundleContext.ungetService(serviceReference);
    }
    return result;
}

Теперь, когда Tomcat использует мост затмения , я не знаю, как получить правильный контекст среды Equinox.Когда я пытаюсь запустить его на Tomcat с Equinox, я получаю исключения NoClassDefFound.Буду признателен за любые советы о том, как решить эту проблему.

Большое спасибо заранее.Приветствия, Ник

Ответы [ 4 ]

2 голосов
/ 25 февраля 2012

Когда вы встраиваете такую ​​среду OSGi, а затем хотите получить доступ к службе OSGi из внешней среды, вы должны быть уверены, что интерфейс службы - это то же самое внутри и снаружи OSGi.

Итак, настройте свой контейнер OSGi для экспорта пакета интерфейса службы из Tomcat в OSGi.Для этого настройте свою OSGi-фреймворк со свойством FRAMEWORK_SYSTEMPACKAGES_EXTRA.

Дополнительная информация о http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html#ApacheFelixFrameworkLaunchingandEmbedding-hostservices (даже если это Apache Felix, API встраивания стандартизирован).

2 голосов
/ 28 декабря 2011

Я делал это до того, как использовал EclipseStarter материал с мостом, и было очень много работы, чтобы правильно подобрать материал для classpath, который является ключом. Вы также должны позвонить EclipseStarter, используя отражение. Похоже, что они стандартизировали это с тех пор, поэтому вам не нужно использовать EclipseStarter.

Ключ здесь (как кратко упомянуто в статье Феликса ) заключается в том, что вам необходимо иметь общий путь к классу между вашей средой Tomcat и вашей средой OSGi. Если вы посмотрите в этой статье раздел, начинающийся с " Использование услуг, предоставляемых пакетами ", похоже, предлагает то, что вы хотите.

У вас должен быть интерфейс к тому, что вы вызываете, в вашем Tomcat (родительском) classpath, а затем вам нужно запустить фреймворк таким образом, чтобы он сначала использовал ваш родительский classpath (что, скорее всего, не работает их средство запуска), и вам необходимо исключить пакет, который предоставляет интерфейс из пакетов OSGi. Я сделал это, создав отдельный пакет OSGi (пакет API), который имел только интерфейсы, поэтому, когда я хотел использовать эту настройку в контексте, где мой код вызывался извне OSGi, я не предоставлял этот пакет API.

0 голосов
/ 24 января 2012

Извините, я не отвечу на ваш вопрос напрямую ... С моей точки зрения, вы не подходите правильно, есть ли у вас какие-либо ценные причины использовать существующий экземпляр Tomcat 7?Я бы использовал более ориентированный на OSGi подход и использовал бы стандартную службу Http для публикации вашего веб-приложения ... В этом контексте оба компонента находятся на одном уровне со стандартными пакетами OSGi, и, следовательно, связь между двумя компонентами действительно проста(прямой вызов метода или асинхронное сообщение с использованием службы EventAdmin) HTH my 2 цента Jerome PS: этот подход дает вам гораздо большую гибкость, его можно использовать с Equinox или любой другой оболочкой OSgi (felix, knopflerfish ..)

0 голосов
/ 24 января 2012

Я преодолел эту проблему, переопределив JasperClass Loader. То, что происходит с каждым пакетом как с собственным загрузчиком классов classdeffnotfound, объясняется тем, что используется загрузчик tomcat.Есть больше ресурсов в Интернете.

...