Вопрос новичка - PullRequest
       1

Вопрос новичка

0 голосов
/ 08 февраля 2011

Привет всем,

Заранее спасибо за помощь.

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

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

Вот мой класс 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 / spring источником, я пытаюсь получить доступ к своему контексту приложения напрямую (без "META-INF / spring"), он не меняет все ....

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

Мне не хватает новых идей. Я просто хочу сделать простое создание экземпляра bean-компонента, я не хочу использовать spring dm, или я не все понимаю, например, как создать экземпляр bean с помощью scope = "prototype"

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

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

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

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

Youтакже можно указать путь к applicationContext.xml (для пружины dm) в MANIFEST (в этом случае путь начинается с '/')

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

Так что если вы не хотите использовать spring dm в OSGIпопробуйте использовать

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

(возможно, '/' важно).

0 голосов
/ 11 февраля 2011

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

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 - идентификатор моего пакета.

В любом случае, спасибо за ваш ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...