我试图开发一个web应用程序,这将是launched from a HTTP OSGi service,这个应用程序需要使用其他的OSGi服务(db4o OSGi),因为我需要参考BundleContext
。我已经尝试了两种不同的方法来获得在Web应用程序的OSGi的背景:如何从Web应用程序使用OSGi服务?
- 商店
Activator
的BundleContext
一类的Web服务可以导入和使用的静态字段。 - 使用
FrameworkUtil.getBundle(this.getClass()).getBundleContext()
(即this
MainPage
,一个Web应用程序的一个实例)。
我认为第一个选项是完全错误的,但无论如何,我在两个选项中遇到了类加载器的问题。在第二个它提出了一个LinkageError
:
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoader) previously initiated loading for a different type with name "com/db4o/ObjectContainer"
与春分也试过,我有一个类似的错误:
java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously initiated loading for a different type with name "com/db4o/ObjectContainer"
是引发异常的代码是:
ServiceReference reference = context.getServiceReference(Db4oService.class.getName());
Db4oService service = (Db4oService)context.getService(reference);
database = service.openFile("foo.db");
的在最后一行中出现异常,database
类为ObjectContainer
,如果我将此变量的类型更改为Object
,则不会引发异常,但它是没有用作为Object
:)
更新:我试图使用其他服务,而不是db4o,他们按预期工作。也许db4o OSGi bundle在加载自己的类时会做一些奇怪的事情,或者我没有正确使用它。如果我使用它从一个非Web包,它也可以工作。
与我在第一种方法中一样,将上下文存储在静态字段中将会不一样吗? 关于玩类加载器,是的,我认为是一样的。谢谢。 – 2010-04-05 08:47:30
是的,它基本上是一样的,只是另一种方法。您应该只将束上下文传递给来自同一束的对象。 – akr 2010-04-05 12:06:07