2016-06-03 8 views
1

Я использовал Felix в качестве встроенной программы, как описано в, How to start and use Apache Felix from code?. Я хочу, чтобы динамически загружать файлы jar из моего приложения-хозяина через OSGi и вызывать методы классов реализации.Felix OSGI Проблема с встроенным приложением

Так я три следующих Maven проектов

1) Maven проект, который имеет интерфейс. И пакет этого интерфейса экспортируется. ---> ProjA.

2) Проект реализации -> ProjB, еще один проект maven, который импортирует ProjA как зависимость от maven и реализует интерфейс с ним с конкретным классом. Также в этом проекте я импортирую пакет OSGi для пакета интерфейса ProjA. Также здесь я регистрирую свою реализацию на OSGI через активатор.

3) Затем ProjC, который является размещенным приложением. Что я там делаю,

HostActivator activator = new HostActivator(); 
    List<Object> list = new LinkedList<Object>(); 
    list.add(activator); 
    map.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list); 
    Felix f = new Felix(map); 
    f.start(); 

    Bundle a = f.getBundleContext().installBundle("file:C:/ProjA.jar"); 
    Bundle b = f.getBundleContext().installBundle("file:C:/ProjB.jar");); // dirty path ;) 
    b.start(); 

    ServiceReference sr = activator.getContext().getAllServiceReferences(MyInterface.class.getName(), "(" + "osgi-device-name" + "=*)")[0]; 
    MyInterface dictionary = (MyInterface) activator.getContext().getService(sr); 
    dictionary.doAction(); 

Все работает нормально до отливки. Там я вижу следующие ошибки,

Exception in thread "main" java.lang.ClassCastException: projB.MyImplementation cannot be cast to projA.MyInterface 
    at MyHostApplication.MyMainClass.main(MyMainClass.java:70) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

Может кто-нибудь помочь мне в этом, для меня это похоже на ошибку на Феликсе.

ответ

2

ProjA находится на пути к классу вашего основного проекта (который открывает встроенный контейнер OSGi), а также устанавливается во встроенный контейнер OSGi в виде пакета. Когда ProjB разрешен, он подключается к пакету ProjA, поэтому он реализует интерфейс, который поступает из установленного пакета projA.

При попытке наложить объект результата, вы пытаетесь применить к интерфейсу, который находится на пути к классу основного проекта. Это другой интерфейс, который реализует пакет ProjB, поскольку он реализует интерфейс из пакета projA.

Вы не должны устанавливать ProjA в виде пакета в контейнер OSGi. Вы должны быть уверены, что пакет ProjB может быть разрешен. Чтобы сделать это, вы должны добавить projA в качестве системного пакета для встроенного контейнера OSGi.

+0

Как я могу добавить пакет системы? Не могли бы вы уточнить больше? – lsc

+2

Привет, configMap.put (Константы.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "host.service.lookup; version = 1.0.0"); ref http://felix.apache.org/documentation/subprojects/apache-felix-framework/apache-felix-framework-launching-and-embedding.html решил мою проблему. Благодаря! – lsc

0

другой способ решить эту проблему с помощью экспорта тег в Maven Maven-расслоением-плагин или файл манифеста

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> 
        <Export-Package>come.example.myInterface</Export-Package> 
        <Bundle-Activator>come.example.Activator</Bundle-Activator> 
       </instructions> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

и did'nt забыть

map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "come.example.myInterface; version=0.0.1"); 

 Смежные вопросы

  • Нет связанных вопросов^_^