OSGI应用程序中的JXBrowser多个startipCtasks.如何正确重新定位浏览器



我正在使用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环境的方法。

最新更新