如何在 Equinox 中通过动态捆绑包安装运行子进程?

How can I run a subprocess in Equinox with dynamic bundle installation?

提问人:mapeters 提问时间:8/27/2018 最后编辑:mapeters 更新时间:3/28/2023 访问量:516

问:

我有一个在 OSGi/Equinox 中运行的 Java 应用程序。从这个应用程序中,我需要生成在OSGi/Equinox中运行的Java子进程(例如通过),以便正确处理类加载。子进程将需要多个捆绑包,因此理想情况下,我想要一些相当动态的方式在子进程的 Equinox 容器中安装这些捆绑包,例如通过读取 feature.xml 文件。ProcessBuilder.start()

我已经通读了这里的程序启动,但我不明白 Equinox 如何适应它。我也考虑过做这样的事情,但它不会是动态的,特别是当子流程的入口点捆绑包需要多个其他捆绑包时,这些捆绑包需要更多的捆绑包,等等。

那么,我怎样才能生成一个子进程,以一种相当动态的方式将捆绑包加载到容器中,在OSGi/Equinox中运行呢?

注意:我需要使用单独的进程。子进程将使用使用全局变量的 JNA 本机库进行数据处理(我无法修改本机库)。因此,为了能够同时处理不同的数据,数据处理需要在单独的进程中运行。

Java OSGi Eclipse-RCP ProcessBuilder Equinox(Equinox

评论

0赞 howlger 9/1/2018
是否要读取文件以找出需要哪些捆绑包?为了解决安装依赖关系,Eclipse 会读取从该功能创建的 p2 存储库的元数据部分等。听起来你想做 Equinox p2 director 所做的事情,其命令行用法在 Eclipse 帮助中进行了描述。在您的案例中,捆绑包来自哪里(来自目录、Eclipse 安装或来自 p2 存储库)?feature.xmlfeature.xml
0赞 nmorenor 12/1/2018
我认为您可以将 与所需的配置数据一起使用,例如您可以向该框架添加捆绑包,但它将在同一个 jvm 中运行,不记得确切的名称,但它就像一个 CompositeTarget 或在某些时候以这种方式调用,不幸的是我无法指出任何关于它的文档。EquinoxFactory.newFramework()osgi.install.area
0赞 Hannes Erven 8/30/2022
ProcessBuilder.start()只会在您的系统上执行命令,例如,您需要找到一种方法在操作系统上将处理应用程序作为可执行文件或脚本启动。由于这将是一个全新的过程,因此调用程序是OSGi还是其他程序并不重要。
0赞 old_dd 12/21/2022
这是一个老问题,但是你有没有研究过 提供的类。它允许您在单独的进程中启动 OSGi/Equinox 容器,并在容器中安装捆绑软件。EquinoxApplicationorg.eclipse.core.runtime.adaptor.EquinoxApplication

答:

0赞 HALİL İBRAHİM KARATAŞ 3/28/2023 #1

您可以使用 Equinox Launcher API。 以下示例演示了如何使用 Equinox Launcher API 启动具有一组捆绑包的 equinox 新实例: `

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);

`