我正在使用OSGI工作应用程序中的JXBrowser插件,但是当我更新插件时,我会收到此错误:
jxbrowser多重实例错误
我找不到有关startipCtask的任何信息,但是我知道当浏览器实例化时是运行的。我试图总是以相同的路径指定BrowserContext,但是我会遇到相同的错误。我还尝试处理浏览器对象(并在更新应用程序更新时可选运行browsercore.shutdown()),但我遇到了相同的错误或所有这些崩溃。
是否有一些特殊的方法来垃圾收集浏览器并确保仅实施startipCtask?我可以在编程中指定哪个是未定义的吗?谢谢!
编辑:不幸的是,我无法发布所有代码,但是该项目的要点将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上,因此必须手动处理浏览器和浏览器。但是添加任一功能没有效果。
然后重新加载应用程序时,启动方法再次运行,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应用程序使用不同的ClassLoaders加载JNI库,这是JXBrowser的一部分。libjxbrowser-common64 ... Dylib是一个单身人士JNI库。如果尝试使用不同的类负载器加载它,则上述错误会发生。这是基于JNi-Osgi部分不兼容的众所周知的限制。同样在MacOSX中,铬过程是作为Java过程的一部分运行的,在多个JXBrowser实例中,配置铬可能具有出乎意料的行为。为了解决这个问题,我建议您将铬作为外部过程,例如使用-djxbrowser.ipc.external = true vm参数,并找到使用JXBrowser库的不同classloader的OSGI环境的方法。