2012-05-11 11 views
1

Apache Karaf上で動作するOSGiバンドル内にxbeanコンフィグレーションを使用して、組み込みActiveMQブローカを作成したいと考えています。このコード:xmlを使用したコンフィグレーションのロード

brokerService = BrokerFactory.createBroker("xbean:file:etc/config.xml"); 

は、次の例外で失敗します。ロードされている

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to load type: org.apache.activemq.xbean.XBeanBrokerService. Reason: java.lang.ClassNotFoundException: org.apache.activemq.xbean.XBeanBrokerService not found by org.apache.xbean.spring [81]; nested exception is java.lang.ClassNotFoundException: org.apache.activemq.xbean.XBeanBrokerService not found by org.apache.xbean.spring [81] 
     at org.apache.xbean.spring.context.v2c.XBeanQNameHelper.getBeanInfo(XBeanQNameHelper.java:75) 
     at org.apache.xbean.spring.context.v2c.XBeanQNameHelper.coerceNamespaceAwarePropertyValues(XBeanQNameHelper.java:54) 
     at org.apache.xbean.spring.context.v2c.XBeanBeanDefinitionParserDelegate.parseBeanDefinitionElement(XBeanBeanDefinitionParserDelegate.java:59) 
     at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:396) 
     at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:224) 
     at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:276) 
     at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:156) 
     at org.apache.xbean.spring.context.v2.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:49) 
     at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1338) 
     at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328) 
     at org.apache.xbean.spring.context.v2.XBeanBeanDefinitionDocumentReader.parseBeanDefinitions(XBeanBeanDefinitionDocumentReader.java:84) 
     at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) 
     at org.apache.xbean.spring.context.v2.XBeanXmlBeanDefinitionReader.registerBeanDefinitions(XBeanXmlBeanDefinitionReader.java:79) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) 
     at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 
     at org.apache.xbean.spring.context.ResourceXmlApplicationContext.loadBeanDefinitions(ResourceXmlApplicationContext.java:111) 
     at org.apache.xbean.spring.context.ResourceXmlApplicationContext.loadBeanDefinitions(ResourceXmlApplicationContext.java:104) 
     at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
     at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397) 
     at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64) 
     at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52) 
     at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:114) 
     at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:114) 
     at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:70) 
     at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71) 
     at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54) 
     at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:85) 
     at jmstest.bundle.TestActivator.start(TestActivator.java:18) 
     at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:629) 
     at org.apache.felix.framework.Felix.activateBundle(Felix.java:1842) 
     at org.apache.felix.framework.Felix.startBundle(Felix.java:1759) 
     at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1163) 
     at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264) 
     at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.ClassNotFoundException: org.apache.activemq.xbean.XBeanBrokerService not found by org.apache.xbean.spring [81] 
     at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:787) 
     at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:71) 
     at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
     at org.apache.xbean.spring.context.v2c.XBeanQNameHelper.loadClass(XBeanQNameHelper.java:107) 
     at org.apache.xbean.spring.context.v2c.XBeanQNameHelper.getBeanInfo(XBeanQNameHelper.java:72) 
     ... 36 more 

すべての必要なバンドルを(ActiveMQの、ActiveMQのスプリング、XBeanのバネ)と実行している、と私のバンドルはImport-Packageでそれらすべてを持っています。

スタンドアロンActiveMQブローカからロードされた同じ設定ファイルが必要なように動作します。

これは、xbeanがインポートしないバンドルからクラスにアクセスできないためだと思います。これを回避する方法はありますか?

答えて

0

これは自分で解決しましたが、ハックのようです。可能であれば、それを正しくする方法を誰かに教えていただきありがとうございます。それは、スレッドのコンテキストクラスローダを含め、クラスをロードしているとき

ClassLoader c = Thread.currentThread().getContextClassLoader(); 
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); 

brokerService = BrokerFactory.createBroker("xbean:file:etc/config.xml"); 
brokerService.start(); 

Thread.currentThread().setContextClassLoader(c); 

XBeanのは、いくつかのクラスローダをしようとします:

アイデアは(私の場合、バンドル・アクティベーター)現在のクラスをロードしたものと、デフォルトのクラスローダを置換することです。もちろん、getClass().getClassLoader()ローダは私のバンドルのインポートについて知っているので、XBeanは必要なすべてのクラスをロードします(Import-Packageヘッダーにある場合)。たぶんこれは他の人にとっても役立つでしょう。