如何在Equinox中运行一个子进程并进行动态捆绑安装?

42
我有一个运行在OSGi/Equinox中的Java应用程序。从这个应用程序,我需要产生Java子进程(例如通过ProcessBuilder.start()),它们也在OSGi/Equinox中运行,以便正确处理类加载。该子进程将需要多个bundle,因此我希望有一种相当动态的方式来安装这些bundle到子进程的Equinox容器中,例如通过读取feature.xml文件。
我已经阅读了此处的程序启动部分,但我不知道如何将Equinox与其组合使用。我还尝试过像这样的方法,但它不太灵活,特别是当子进程的入口点bundle需要多个其他bundle时,这些bundle又需要进一步的bundle等等。
那么,我该如何生成一个子进程,在其中以相当动态的方式加载bundle到容器中以运行在OSGi/Equinox中?
注意:我需要使用单独的进程。子进程将使用使用全局变量的JNA本地库进行数据处理(而且我无法修改本地库)。因此,为了能够同时处理不同的数据,数据处理需要在单独的进程中运行。

你想读取 feature.xml 文件以查找所需的 Bundle 吗?为了解析安装依赖项,Eclipse 读取从特性 feature.xml 创建的 p2 存储库的元数据部分等。这听起来像是你想要做 Equinox p2 director 所做的事情,其命令行用法在 Eclipse 帮助中有描述。在你的情况下,这些 Bundle 是从哪里获取的(来自目录、Eclipse 安装或来自 p2 存储库)? - howlger
我认为你可以使用EquinoxFactory.newFramework()并提供所需的配置数据,例如osgi.install.area,然后将bundle添加到该框架中,但它将在同一个jvm中运行。我不太记得确切的名称,但它类似于CompositeTarget或曾经被称为这样,在某些时候很不幸,我无法指向任何相关文档。 - nmorenor
ProcessBuilder.start() 只会在您的系统上执行命令,例如您需要找到一种方法将处理应用程序作为可执行文件或脚本启动在您的操作系统上。由于这将是一个全新的进程,因此调用程序是 OSGi 还是其他什么并不重要。 - Hannes Erven
这是一个老问题,但你是否研究过由org.eclipse.core.runtime.adaptor.EquinoxApplication提供的EquinoxApplication类?它允许您在单独的进程中启动OSGi/Equinox容器并在容器中安装捆绑包。 - old_dd
1个回答

0

你可以使用Equinox Launcher API。 以下是一个示例,展示如何使用Equinox Launcher API启动一组bundle的新实例:

EquinoxLauncher launcher = new EquinoxLauncher();
String equinoxHome = "/path/to/equinox/home"; 
String[] bundlePaths = { "/path/to/bundle1.jar", "/path/to/bundle2.jar" }; 

EquinoxRunConfiguration runConfig = launcher.newConfiguration();
runConfig.setWorkingDir(new File(equinoxHome));
runConfig.setFramework(new File(equinoxHome, "plugins/org.eclipse.osgi.jar"));
runConfig.addProgramArg("-console");
runConfig.addProgramArg("-noExit");
for (String bundlePath : bundlePaths) {
    runConfig.addBundle(new File(bundlePath).toURI());
}

EquinoxRunMonitor monitor = launcher.launch(runConfig);

`


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接