Использование пакета OSGi из веб-приложения Java в Tomcat
Я пытаюсь вызвать метод пакета 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. Я был бы признателен за любые советы о том, как решить эту проблему.
Большое спасибо.
Cheers, Nic
Ответы
Ответ 1
Когда вы внедряете инфраструктуру 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
Я сделал это, прежде чем использовать материал EclipseStarter
с мостом, и было очень много работы, чтобы получить свойство classpath правильно, что является ключом. Вы также должны вызвать EclipseStarter
с помощью отражения. Похоже, что они стандартизировали это с тех пор, поэтому вам не нужно использовать EclipseStarter
.
Ключ здесь (кратко описанный в статье Felix заключается в том, что у вас должен быть общий путь к классам между вашей средой Tomcat и средой OSGi Если вы посмотрите в этой статье в разделе, начинающемся с "Использование служб, предоставляемых связями", кажется, что вы предлагаете то, что хотите.
Вам нужно будет иметь интерфейс к тому, что вы вызываете в своем пути Tomcat (родительский), а затем вам нужно запустить фреймворк, чтобы он сначала использовал ваш родительский путь к классам (что, скорее всего, не работает с пусковой установкой) и вам нужно исключить пакет, который предоставляет интерфейс из пакетов OSGi. Я достиг этого, создав отдельный пакет OSGi (пакет API), который только что имел интерфейсы, поэтому, когда я хотел использовать эту настройку в контексте, где мой код вызывался из-за OSGi, я бы не предоставил этот набор API.
Ответ 3
Я преодолел этот вызов, переопределив загрузчик JasperClass, что происходит с каждым пакетом, поскольку его класс loader класса classdeffnotfound - это то, что используется загрузчик tomcat. В Интернете больше ресурсов.
Ответ 4
Извините, я не отвечу прямо на ваш вопрос...
С моей точки зрения, вы не пользуетесь хорошим подходом, есть ли у вас какая-то ценная причина использовать существующий экземпляр Tomcat 7?
Я бы использовал более ориентированный на OSGi подход и использовал стандартную службу Http для публикации вашего веб-приложения... В этом контексте оба компонента находятся на одном уровне с стандартными пакетами OSGi, а затем, как следствие, связь между двумя компонентами очень проста (непосредственное обращение к методу или асинхронное сообщение с использованием службы EventAdmin)
НТН
мои 2 цента
Джером
PS:
этот подход дает вам гораздо большую гибкость, его можно использовать с Equinox или любой другой оболочкой OSgi, которую вы хотите (felix, knopflerfish..)