我正在尝试在 Websphere 6.1 服务器上嵌入 Equinox 框架,但在尝试了几乎所有内容后,我认为我需要一些帮助。
主要问题似乎是我无法在我的项目中导入任何我想要的框架(较新的Equinox,Apache Felix等)。当我这样做时,我得到很多异常,告诉我加载的类不是我想要的(ClassNotFoundException,MethodNotFoundException等)。
所以我发现我需要使用Websphere附带的某个版本( org.eclipse.osgi_3.2.1.R32x_v20060919.jar )。问题:我不知道如何获得 BundleContext 。
我尝试过的事情:
使用ServiceLoader
类:
FrameworkFactory ff = ServiceLoader.load(FrameworkFactory.class);
结果:我需要使用没有ServiceLoader类的Java 1.5。
使用EclipseStarter
类启动框架:
BundleContext context = EclipseStarter.startup(new String[]{},null);
结果:抛出异常,告知Eclipse已在运行。
使用EclipseStarter
获取系统包上下文:
BundleContext context = EclipseStarter.getSystemBundleContext();
结果:此版本未实施该方法。
使用EquinoxFactory
类:
Framework fw = new EquinoxFactory().newFramework(...);
结果:我的Equinox版本没有EquinoxFactory类实现。
我不知道还有什么可以尝试的。我找不到很多关于这个版本的文档,我发现的几乎所有内容都是关于使用控制台,而不是嵌入框架。
如果我做对了,我们将避免为创建PDF而启动新的JVM(我们试图使用多个版本的Apache FOP)
感谢。
答案 0 :(得分:1)
从版本6.1开始,WebSphere本身在Equinox上运行。您对问题的描述表明您的代码实际上并未尝试创建嵌入式Equinox容器,而是与WebSphere的Equinox容器进行交互。可能的原因是应用程序的类加载器使用默认的父第一委托模式。您需要做的第一件事是将它们配置为使用父级模式,以便您的应用程序与WebSphere中的Equinox代码隔离。这也将删除您可以使用的OSGi容器的类型和版本的约束。
答案 1 :(得分:1)
如果您可以升级到WebSphere 7,则可以安装OSGi Applications Feature Pack。这将允许您利用Enterprise OSGi编程模型;例如,您可以使用Blueprint注入bundle上下文,或者您可以更进一步使用Blueprint以声明方式执行您通常使用bundle上下文执行的许多操作。如果您可以访问WebSphere 8.5.5 Liberty Profile,您可以将任意捆绑包作为扩展(user features)安装到服务器本身,以及安装OSGi应用程序。但是,这两种解决方案都需要基础架构升级,它不会听起来你可以做到。
答案 2 :(得分:0)
如果您不能使用ServiceLoader,那么您可以直接实例化FrameworkFactory
的Equinox实现,即org.eclipse.osgi.launch.EquinoxFactory
(通过读取Equinox JAR的META-INF/services
条目指示)
有关嵌入OSGi的更多信息,请参阅我刚才写的博文:http://njbartlett.name/2011/03/07/embedding-osgi.html