2017-08-31 8 views
0

Je travaille sur un plugin JXBrowser dans une application OSGi pour le travail, mais quand je mets à jour le plug-in-je obtenir cette erreur:JXBrowser plusieurs StartIPCTasks dans l'application OSGi. Comment réinitialiser le navigateur correctement?

JXBrowser multiple instance error

Je ne peux trouver aucune information sur le StartIPCTask, mais je savoir qu'il est exécuté lorsqu'un navigateur est instancié. J'ai essayé de spécifier toujours BrowserContext avec le même chemin, mais j'ai la même erreur. J'ai également essayé de disposer de l'objet du navigateur (et éventuellement exécuter BrowserCore.shutdown()) lorsque l'application est mise à jour, mais j'ai la même erreur ou tout se bloque.

Existe-t-il un moyen spécial de récupérer les navigateurs et de s'assurer que StartIPCTask n'est implémenté qu'une seule fois? Puis-je spécifier lequel est indéfini par programmation? Merci!

EDIT: Malheureusement, je ne peux pas poster tout mon code, mais l'essentiel du projet est JXBrowser dans une encapsuler application. Ainsi, lorsque l'application est créée, elle appelle une fonction start, qui contient:

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

Avant l'application est réinstallée pour une mise à jour, la méthode shutdown() est appelée, qui est en ce moment juste:

if (browser != null) 
    browser.dispose(); 

Selon la documentation, puisque je suis sur Mac OSX, Browsers et BrowserContexts doivent être éliminés manuellement. Mais l'ajout de l'une ou l'autre fonction n'a aucun effet.

Lorsque l'application est alors rechargée, la méthode de démarrage est exécuté à nouveau et la ligne de déclaration browser échoue avec l'erreur suivante:

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. 

Mais il n'y a pas possibilité de spécifier qui est définie. Donc, à la place, il reste gelé pendant ~ 1 minute, puis le code continue avec browser comme nulle.

Devrais-je spécifier un BrowserContext autre que BrowserContext.defaultContext()? Comment informer BrowserCore de quitter sans quitter l'application parente et puis-je créer un nouveau navigateur?

Répondre

0

Vous voyez cette erreur car votre application OSGI utilise différents ClassLoaders pour charger la bibliothèque JNI qui fait partie de JxBrowser. Le libjxbrowser-common64 ... dylib est une bibliothèque JNI singleton. Si vous essayez de le charger avec différents ClassLoaders, l'erreur mentionnée ci-dessus se produit. Ceci est une limitation bien connue basée sur l'incompatibilité partielle JNI-OSGI. Également dans MacOSX, le processus Chromium est exécuté dans le cadre du processus Java et, dans la configuration des instances JxBrowser multiples, Chromium peut avoir un comportement inattendu. Pour résoudre ce problème, je suggère d'exécuter Chromium en tant que processus externe, par ex. en utilisant le paramètre -Djxbrowser.ipc.external = true VM, et trouvez le moyen d'interdire l'environnement OSGI en utilisant différentes ClassLoaders pour la bibliothèque JxBrowser.