Вставить ОСГИ в войну
Я заинтересован в добавлении контейнера OSGI в мою WAR, но я не могу найти учебник или документацию о том, как это сделать. Я нашел некоторые вещи, которые не являются полезными вообще. Я заинтересован в реализации Felix и Atlassian.
Я хочу сделать это так, чтобы моя война принимала плагины, и я мог динамически расширять свое веб-приложение, а также развертывать его на любом веб-сервере.
Есть ссылки на документацию или что-то? Любая помощь приветствуется.
3 ответа
Добавление средства запуска OSGi Framework в веб-приложение не имеет большого значения.
Вам нужно добавить слушатель, чтобы запустить средство запуска фреймворка в вашем файле web.xml.
<listener> <listener-class>at.badgateway.StartupListener</listener-class> </listener>
Startlistener может выглядеть так
public class StartupListener implements ServletContextListener {
//vars
@Override
public void contextInitialized(ServletContextEvent event) {
// set props
Map<String, String> config = new HashMap<String, String>();
config.put(Constants.FRAMEWORK_STORAGE, "path to cache");
config.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");
try {
// get framework and start it
FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
framework = frameworkFactory.newFramework(config);
framework.start();
// start existing bundles
bundleContext = framework.getBundleContext();
starter = new MyBundleStarter(servletContext, bundleContext);
starter.launch();
} catch (Exception ex)
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// stop framework
}
}
Позаботьтесь о классе MyBundlestarter в верхней кавычке, это класс, который активирует все связки, содержащиеся в вашей войне. (например, /WEB-INF/Osgi-Bundles)
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
public class MyBundleStarter{
private BundleContext bundleContext = null;
public void launch() throws Exception {
ArrayList<Bundle> availableBundles= new ArrayList<Bundle>();
//get and open available bundles
for (URL url : getBundlesInWar()) {
Bundle bundle = bundleContext.installBundle(url.getFile(), url.openStream());
availableBundles.add(bundle);
}
//start the bundles
for (Bundle bundle : availableBundles) {
try{
bundle.start();
}catch()
}
private List<URL> getBundlesInWar() throws Exception {
// returns a list of URLs located at destination
}
}
И последнее, но не менее важное: вы должны добавить osgi-фреймворк в ваш проект.
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.framework</artifactId>
</dependency>
или же
<dependency>
<groupId>org.eclipse.osgi</groupId>
<artifactId>org.eclipse.osgi</artifactId>
</dependency>
Я вижу, что это старый пост, но, возможно, он может быть кому-то полезен: этот текст содержит много полезных вещей в этой теме, по крайней мере, для меня это было действительно большим подспорьем. И стоит взглянуть на другие посты на этой странице.
Если вы используете WebLogic для размещения своего приложения, вы можете встраивать OSGi-пакеты в WAR-файл и развертывать их на системном OSGi-сервере. Это хорошо, потому что сообщения журнала от службы журналов OSGi могут автоматически отображаться в журналах WebLogic. Также ваши пакеты будут удалены с целевого сервера OSGi, когда вы удаляете приложение.
Для получения дополнительной информации см. Настройка контейнеров OSGi или разработка приложений OSGi или этот пост в блоге.