2015-07-22 2 views
0

Я пытаюсь настроить приложение, которое работает на OSGi, и попытался использовать учебник here, но я получаю сообщение об ошибке «Метод getBundleContext() не определен для типа Framework« все время » , Насколько я могу судить, я использую нужную библиотеку, но в указанной статье она не указана, поэтому я не уверен на 100%. Я также попробовал примеры на веб-сайте Apache, here, что приводит к той же проблеме. Код ниже:getBundleContext метод undefined issue

import java.util.HashMap; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Map; 
import java.util.ServiceLoader; 

import org.osgi.framework.Bundle; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.BundleException; 
import org.osgi.framework.launch.Framework; 
import org.osgi.framework.launch.FrameworkFactory; 

public class Main { 
    public static void main(String[] args) throws BundleException { 
     FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next(); 
     Map<String, String> config = new HashMap<String, String>(); 
     Framework framework = frameworkFactory.newFramework(config); 
     framework.start(); 

     // Throws error that it cannot find method getBundleContext() 
     BundleContext context = framework.getBundleContext(); 
     List<Bundle> installedBundles = new LinkedList<Bundle>(); 

     installedBundles.add(context.installBundle("file:org.apache.felix.shell-1.4.2.jar")); 
     installedBundles.add(context.installBundle("file:org.apache.felix.shell.tui-1.4.1.jar")); 

     for (Bundle bundle : installedBundles) { 
      bundle.start(); 
     } 
    } 
} 

Единственное, что имеет смысл в том, что либо я использую неправильные библиотеки или библиотеки изменились, и метод, который я пытаюсь позвонить с тех пор является устаревшим в последние 4 года. Кто-нибудь знает, как я могу это исправить?

Я сомневаюсь, что это имеет большое значение, но в случае, если это так, я использую Bndtools для Eclipse для создания этого проекта.

ответ

0

Обнаружена проблема. По-видимому, импорт osgi.core, который был в пути сборки проекта Bndtools, устарел, не позволяя коду получить доступ к правильной версии библиотек фреймов. Обновление, исправляющее проблему.

Дополнительная сторона-примечание; Так как я использую Bndtools, я добавлял это в путь сборки проекта через вкладку сборки bnd.bnd. Это, однако, не хватало правильной версии osgi.core, поэтому мне пришлось идти в исходное положение и добавить version=latest, чтобы заставить ее получить самую последнюю версию, поэтому теперь строка выглядит как: osgi.core;version=latest, где ранее было osgi.core в разделе -buildpath:.

+0

В любом случае, вероятно, неразумно иметь две версии библиотеки на вашем пути сборки. –

+0

Да, это была простая ошибка, которую я пропустил. У них также были разные имена в файле, поэтому я сначала забыл об этом. Версия Bndtools называлась 'osgi.core', где более новая была фактически названа' org.apache.felix.framework'. – DGolberg

+1

Это не просто другое имя, это другая библиотека, у него просто перекрывающееся содержимое. Felix - это реализация OSGi, тогда как 'osgi.core' - это чистый API, опубликованный Alliance OSGi. Я настоятельно рекомендую строить против 'osgi.core' ... вам просто нужно получить правильную версию. –