Hy everybody,
Thanks in advance for your help.
Here is my problem.
I want to instanciate a simple bean from spring into an OSGI Bundle.
Here is my java class :
package testspring;
public class ClassIOC {
public void helloWorld(){
System.out.println("Hello World Spring with OSGI");
}
}
Here is my activator
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;
}
}
Here is my manifest :
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"
I check into my OSGI container and I have all thoses bundles.
Each times I activate my bundle i have the following exception :
org.osgi.framework.BundleExce开发者_Go百科ption: 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
I have try to declare META-INF/spring directory as source, I try to access to my application Context directly (without "META-INF/spring"), it doesn't change everything....
If I add the spring bundles as jar, it works...
I'm missing of new ideas. I just want to do a simple instanciation of bean, I don't want to use spring dm, or I have don't understand everything, like how to instanciate bean with scope="prototype"
Am i forced to use spring dm ?
best regards
If you use Spring DM it will make live much easier as it e.g. creates the application context for you if you place the files in the META-INF/spring directory.
You can also specify the applicationContext.xml path (for spring dm) in the MANIFEST (in this case the path starts with a '/')
Spring-Context: /META-INF/spring/applicationContext.xml
So if you do not want to use spring dm in OSGI try to use
ApplicationContext appContext = new ClassPathXmlApplicationContext(
"/META-INF/spring/applicationContext.xml");
(maybe the '/' is important).
Finally I found an answer.
OSGI is not designed to have access to it application context. To do instantiation, it is better to expose beans as services. But it is possible to access them in the following way :
ServiceReference webContext = context.getAllServiceReferences("org.springframework.context.ApplicationContext", "(org.springframework.context.service.name=com.binomed.osgi.spring.test)")[0];
where com.binomed.osgi.spring.test is the id of my bundle.
Thanks anyway for your response
精彩评论