2012-05-11 30 views
1

我想在Apache Karaf上運行的OSGi包內使用xbean配置創建嵌入式ActiveMQ代理。此代碼:apache karaf中的activemq,使用xbean加載配置

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嘗試幾個類加載器,當它被加載類,包括線程上下文的classloader 。當然,getClass().getClassLoader()加載器知道我的包的導入,因此XBean設法加載所有需要的類(只要它們在Import-Package標頭中)。也許這對別人也有幫助。