2011-02-08 3 views
0

Hy all,Newbee question

Заранее за вашу помощь.

Вот моя проблема.

Я хочу создать простой боб из весны в комплект OSGI.

Вот мой Java класс:

package testspring; 

public class ClassIOC { 

    public void helloWorld(){ 
     System.out.println("Hello World Spring with OSGI"); 
    } 

} 

Вот мой активатор

package testspring; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class Activator implements BundleActivator { 

    private static BundleContext context; 

    static BundleContext getContext() { 
     return context; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext 
    *) 
    */ 
    public void start(BundleContext bundleContext) throws Exception { 
    Activator.context = bundleContext; 

     ApplicationContext appContext = new ClassPathXmlApplicationContext(
       "META-INF/spring/applicationContext.xml"); 
     ClassIOC instance = (ClassIOC) appContext.getBean("ClassIOC"); 
     instance.helloWorld(); 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) 
    */ 
    public void stop(BundleContext bundleContext) throws Exception { 
     Activator.context = null; 
    } 

} 

Вот мой манифест:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: TestSpring 
Bundle-SymbolicName: TestSpring 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: testspring.Activator 
Bundle-ActivationPolicy: lazy 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Import-Package: org.osgi.framework;version="1.3.0" 
Bundle-ClassPath: . 
Require-Bundle: org.springframework.aop;bundle-version="2.5.6", 
org.springframework.beans;bundle-version="2.5.6", 
org.springframework.context;bundle-version="2.5.6", 
org.springframework.core;bundle-version="2.5.6", 
com.springsource.org.apache.commons.logging;bundle-version="1.1.1", 
com.springsource.org.apache.log4j;bundle-version="1.2.15" 

проверить в мой OSGI контейнер и у меня есть все пучки.

Каждый раз я активировать узелок у меня есть следующее исключение:

org.osgi.framework.BundleException: Activator start error in bundle TestSpring [36]. 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:1869) 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:1739) 
     at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:922) 
     at org.apache.felix.gogo.command.Basic.start(Basic.java:758) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136) 
     at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82) 
     at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:458) 
     at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:384) 
     at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108) 
     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183) 
     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120) 
     at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:79) 
     at org.apache.felix.gogo.shell.Console.run(Console.java:62) 
     at org.apache.felix.gogo.shell.Shell.console(Shell.java:198) 
     at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:124) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136) 
     at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82) 
     at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:458) 
     at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:384) 
     at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108) 
     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183) 
     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120) 
     at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:79) 
     at org.apache.felix.gogo.shell.Activator.run(Activator.java:75) 
     at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-I 
NF/spring/applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/spring/applicationContex 
t.xml] cannot be opened because it does not exist 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:349) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310) 
     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143) 

     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) 

     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) 

     at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212) 

     at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113) 
     at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:80) 
     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContex 
t.java:123) 
     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352) 
     at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
     at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
     at testspring.Activator.start(Activator.java:31) 
     at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:633) 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:1822) 
     ... 32 more 
Caused by: java.io.FileNotFoundException: class path resource [META-INF/spring/applicationContext.xml] cannot be opened because it does not 
exist 
     at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:143) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) 
     ... 47 more 
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/spring/a 
pplicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/spring/applicationContext.xml] cann 
ot be opened because it does not exist 

меня пытаются объявить каталог META-INF/пружинный в качестве источника, я пытаюсь получить доступ к моему Контекстное непосредственно (без «META -INF/весна "), это не меняет все ....

Если добавить пружинные пакеты в баночке, она работает ...

Мне не хватает новых идей. Я просто хочу сделать простой instanciation из bean, я не хочу использовать весну dm, или я не понимаю все, например, как инициировать bean-компонент с масштабом = «прототип»

Я вынужден использовать весна дм?

наилучшими пожеланиями

+4

Пожалуйста, не использовать предметы, как «[OSGI-Spring] Newbee вопрос», он не говорит нам абсолютно ничего.Используйте теги для '[spring] [osgi]' и поместите что-то описательное в тему. – skaffman

ответ

-1

Наконец-то я нашел ответ.

OSGI не предназначен для доступа к контексту приложения. Чтобы создать экземпляр, лучше выставить бобы в качестве сервисов. Но можно получить доступ к ним следующим образом:

ServiceReference webContext = context.getAllServiceReferences("org.springframework.context.ApplicationContext", "(org.springframework.context.service.name=com.binomed.osgi.spring.test)")[0]; 

где com.binomed.osgi.spring.test это идентификатор моей пачке.

Спасибо в любом случае за ответ

+2

Это не отвечает на ваш вопрос (java.io.FileNotFoundException: ресурс пути класса [META-INF/spring/applicationContext.xml]). Было бы неплохо, если бы вы дали подсказку, если предложенный ответ решает эту проблему. Если это хороший стиль для доступа к контексту приложения или пакета, это разные вопросы. Spring DM предлагает серверные интерфейсы (BundleContextAware/ApplicationContextAware) для легкого доступа к этому. Кроме того, регистрация и доступ к службам OSGi действительно упрощаются. См. Http://static.springsource.org/osgi/docs/1.2.1/reference/html/. – FrVaBe

2

Если вы используете Spring DM это будет сделать намного проще жить в нем, например, создает контекст приложения для вас, если вы поместите файлы в каталог META-INF/spring.

Вы также можете указать путь applicationContext.xml (для пружинного дм) в манифесте (в данном случае путь начинается с «/»)

Spring-Context: /META-INF/spring/applicationContext.xml 

Так что, если вы не хотите использовать пружину dm в OSGI попытаться использовать

ApplicationContext appContext = new ClassPathXmlApplicationContext(
       "/META-INF/spring/applicationContext.xml"); 

(может быть, важно значение '/').