2014-01-28 2 views
0

У меня есть компонент пучка,org.apache.felix.ipojo.ComponentFactory не может быть приведен к org.apache.felix.ipojo.Factory

package ipojo; 

import ipojo.service.Hello; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Invalidate; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.apache.felix.ipojo.annotations.Validate; 


    @Component(name="hello-factory") 
    @Provides 
    public class HelloImpl implements Hello{ 

     @Override 
     public void shoutHello() { 

      System.out.println("HellooOOOOoooOooo!"); 

     } 


     @Validate 
     public void start() throws Exception { 

      System.out.println("Hello started :)"); 

     } 

     @Invalidate 
     public void stop() throws Exception { 

      System.out.println("Hello Stopped :("); 

     }  

    } 

В моей Java-приложении, я встроил Apache Felix и развернутый iPOJO API. Затем я попытался создать экземпляр моей выше компоненты, используя Factory Service, как:

myBundle= context.installBundle("myBundlePath"); 
    myBundle.start(); 


    ServiceReference[] references = myBundle.getBundleContext().getServiceReferences(Factory.class.getName(), "(factory.name=hello-factory)"); 

    if (references == null) { 
    System.out.println("No references!"); 
    } 

    else { 
    System.out.println(references[0].toString()); 
    Factory factory = myBundle.getBundleContext().getService(references[0]); 
    ComponentInstance instance= factory.createComponentInstance(null); 
    instance.start(); 

    } 

я успешно получил ссылку на службу фабрики, но в следующей строке:

Factory factory = myBundle.getBundleContext().getService(references[0]); 

Я получаю следующее ClassCastException:

java.lang.ClassCastException: org.apache.felix.ipojo.ComponentFactory cannot be cast to org.apache.felix.ipojo.Factory` 

Я изменил эту строку:

Factory factory = (ComponentFactory) myBundle.getBundleContext().getService(references[0]); 

тогда я получил:

java.lang.ClassCastException: org.apache.felix.ipojo.ComponentFactory cannot be cast to org.apache.felix.ipojo.ComponentFactory 

Как я могу решить мою проблему? Спасибо.

ответ

1

При встраивании Felix (или любых других систем OSGi) вы создаете границу между загрузчиками классов. Хост и пакеты не используют одни и те же загрузчики классов, что означает, что классы изнутри и снаружи несовместимы. Другими словами, доступ к службам OSGi от хоста особенно сложный и требует использования рефлексии.

Для простоты вы должны использовать сервис Factory (и любые другие сервисы) из пакета, а не из хоста.

Если вам действительно нужно использовать их с хоста, вы должны настроить рамки OSGi экспортировать все необходимые пакеты из пучка 0.

+0

благодарит Климента. Что вы подразумеваете под пучком 0? Вы хотите экспортировать пакеты в моем хост-приложении, используя Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA? – user3243330

+0

Перемещение моего кода в пакет OSGI работало для меня. Но я заинтересован в использовании его у моего хоста. Поэтому, что именно экспортировать?И почему это решение будет работать? – user3243330

+0

Использование вышеуказанного решения. В моем хосте я устанавливаю Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA для всех пакетов ipojo, которые можно найти на земле. Тем не менее, я получаю ту же ошибку. java.lang.ClassCastException: org.apache.felix.ipojo.ComponentFactory нельзя отнести к org.apache.felix.ipojo.Factory' –

0

Это исключение означает, что существуют проблемы с классом, поскольку в пути к классам существует несколько версий библиотек.

A ClassCastException, когда класс не может быть отнесен к классу с тем же именем, вызван попыткой бросить классы через загрузчики классов: это невозможно сделать, см. here.

Классный загрузчик, который загружает класс, является частью уникального идентификатора класса.

Таким образом, два класса с одинаковым именем org.apache.felix.ipojo.ComponentFactory не будут совпадать, если они загружаются в разные загрузчики классов.

Вам нужно отладить свой путь к классам, найти нежелательную версию библиотеки, содержащей этот класс, и удалить ее.

+0

мой путь к классам кажется чистой. У меня есть только felix.jar и org.apache.felix.ipojo-1.6.0.jar как библиотеки. Что еще может быть проблемой? – user3243330

+0

Взгляните на кризис идентичности классов http://www.ibm.com/developerworks/java/library/j-dyn0429/ и отлаживайте classpath, который ищет два баночки, содержащие ComponentFactory. Есть две версии ComponentFactory где-то точно, так как это единственное объяснение последнего класса ClassCastException, которое вы показываете, надеюсь, что это поможет. –

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