2016-08-15 56 views
0

我正在編寫intelij插件並希望在運行時下載特定於平臺的人造物。Jxbtrowser在運行時檢索平臺特定的人工製品

我已經將平臺特定的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 
} 

回答

0

以下的伎倆,資源罐子必須是在同一個類加載器作爲客戶端的jar(以及許可證)。如果JxBrowser爲此添加了一個幫助程序,該程序能夠執行下載和初始化鉻,可能只需要一個持久存儲目錄的路徑,那就太好了。

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

}