Jxbtrowser在运行时

时间:2016-08-15 11:10:09

标签: java jxbrowser

我正在编写一个intelij插件,并希望在运行时下载特定于平台的artefact。

我已经将特定于平台的jar加载到类加载器中,但是当前缀为“/”时,ChromiumExtractor无法访问嵌套资源。所以我可以访问资源“chromium-mac.zip”,但库不能。

我试图将嵌套的压缩的铬制品解压缩到正确的目录中,但这不会导致工作解决方案。所以现在我一直试图将图书馆提取人工制品的方式拼凑在一起,但由于代码被混淆了,所以它相当繁琐。

jxbrowser插件是否支持在运行时检索artefact。可以添加这样的支持(jxbtrowser devs使用SO来提供支持问题等,这是给他们的信息:D)?

采取的方法:

// inside intelij plugin . The plugin has the jxbrowser-6.6.jar 
// and license.jar loaded into the classloader. the platform specific
// artefact will be retrieved manual).

val cl = URLClassLoader(arrayOf(URL("file://.../jxbrowser-mac-6.6.jar")), Browser::class.java.classLoader)


val backup = Thread.currentThread().contextClassLoader
try {
    Thread.currentThread().contextClassLoader = cl
    // can access like this
    Thread.currentThread().contextClassLoader.getResource("chromium-mac.zip")
    val ce = ChromiumExtractor.create()
    // cannot access as resource is retrieved "/chromium-mac.zip" ? 
    ce.extract(BrowserPreferences.getChromiumDir())

    browser = Browser()
} finally {
    Thread.currentThread().contextClassLoader = backup
}

1 个答案:

答案 0 :(得分:0)

以下是技巧,资源jar必须与客户端jar(以及许可证)位于同一个类加载器中。如果JxBrowser为此添加了一个能够执行下载和初始化chrome的帮助器,可能只需要一个持久存储目录的路径,那就太好了。

private fun initializeJxBrowser(): Browser {
    if(ChromiumExtractor.create().shouldExtract(BrowserPreferences.getChromiumDir())) {
       val cl = URLClassLoader(arrayOf(
                URL("file:.../license.jar"),
                URL("file:.../jxbrowser-mac-6.6.jar"),
                URL("file:../jxbrowser-6.6.jar")
                ))

        cl.loadClass("com.teamdev.jxbrowser.chromium.BrowserContext")
          .getMethod("defaultContext")
          .invoke(null)
   }
   return Browser()

}