我正在尝试开发一个将从 HTTP OSGi 服务启动的 Web 应用程序,该应用程序需要使用其他 OSGi 服务(db4o OSGi),因为我需要引用一个BundleContext
. 我尝试了两种不同的方法来获取 Web 应用程序中的 OSGi 上下文:
BundleContext
将的存储在Activator
Web 服务可以导入和使用的类的静态字段中。- 使用
FrameworkUtil.getBundle(this.getClass()).getBundleContext()
(作为Web 应用程序this
的一个类的实例MainPage
)。
我认为第一个选项是完全错误的,但无论如何我在两个选项中的类加载器都有问题。在第二个中,它提出了一个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"
也尝试过Equinox,我有一个类似的错误:
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 包在加载它自己的类时做了一些奇怪的事情,或者我没有正确使用它。如果我从非 Web 包中使用它,它也可以工作。