OSGi 应用程序中的 JXBrowser 多个 StartIPCTasks。如何正确重新初始化浏览器?
JXBrowser multiple StartIPCTasks in OSGi application. How to reinitialize Browser properly?
我正在 OSGi 应用程序中使用 JXBrowser 插件进行工作,但是当我更新插件时出现此错误:
JXBrowser multiple instance error
我找不到关于 StartIPCTask 的任何信息,但我知道在实例化浏览器时它是 运行。我试图始终使用相同的路径指定 BrowserContext,但我得到了相同的错误。我还尝试在更新应用程序时处理浏览器对象(以及可选的 运行ning BrowserCore.shutdown()),但我遇到相同的错误或全部崩溃。
是否有一些特殊的方法来收集浏览器的垃圾并确保 StartIPCTask 只执行一次?我可以以编程方式指定哪个未定义吗?谢谢!
编辑:
不幸的是,我不能 post 我所有的代码,但该项目的要点是将 JXBrowser 封装在一个应用程序中。因此,在创建应用程序时,它会调用一个 start
函数,其中包含:
try {
browser = new Browser();
browserView = new BrowserView(browser);
browser.addScriptContextListener(new ScriptContextAdapter() {
@Override
public void onScriptContextCreated(ScriptContextEvent event) {
Browser browser = event.getBrowser();
JSValue window = browser.executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("browser", browser);
}
});
} catch (IPCException exception) {
System.out.println("Must restart to use browser");
// This executes after a 1 minute delay (shown below)
}
在重新安装应用程序进行更新之前,调用了 shutdown()
方法,现在只是:
if (browser != null)
browser.dispose();
根据文档,由于我在 Mac OSX,必须手动处理浏览器和 BrowserContexts。但是添加任何一个功能都没有效果。
然后重新加载应用程序时,启动方法再次为 运行,并且 browser
声明行失败并出现以下错误:
objc[71371]: Class StartIPCTask is implemented in both
/path/to/karaf_data/tmp/jxbrowser-chromium-55.0.2883.87.6.14.2/data/Temp/libjxbrowser-common64-fb50af13-9fbf-4fe0-a9cf-0a1f9d1201a7.dylib (0x144e95610)
and /path/to/karaf_data/tmp/jxbrowser-chromium-55.0.2883.87.6.14.2/data/Temp/libjxbrowser-common64-29e240a5-75e5-4ece-9fe7-33dd8b3245cb.dylib (0x180db9610).
One of the two will be used. Which one is undefined.
但是没有指定哪个未定义的选项。因此,它会保持冻结状态约 1 分钟,然后代码继续 browser
为 null。
我是否应该指定 BrowserContext.defaultContext() 以外的 BrowserContext?如何在不退出父应用程序的情况下通知BrowserCore退出,然后再创建一个新的浏览器?
您看到此错误是因为您的 OSGI 应用程序使用不同的类加载器来加载作为 JxBrowser 一部分的 JNI 库。 libjxbrowser-common64...dylib 是一个单例 JNI 库。如果您尝试使用不同的 ClassLoader 加载它,则会发生上述错误。这是基于 JNI-OSGI 部分不兼容的众所周知的限制。 同样在 MacOSX 中,Chromium 进程是 运行 作为 Java 进程的一部分,并且在多个 JxBrowser 实例配置 Chromium 中可能有意外行为。 要解决此问题,我建议您 运行 Chromium 作为外部进程,例如使用 -Djxbrowser.ipc.external=true VM 参数,找到禁止 OSGI 环境使用 JxBrowser 库的不同类加载器的方法。