2016-08-15 5 views
0

私はintelijプラグインを作成しており、実行時にプラットフォーム固有のアーティファクトをダウンロードしたいと考えています。Jxbtrowserは実行時にプラットフォーム固有のアーティファクトを取得します

プラットフォームローダーにプラットフォーム固有のjarをロードしましたが、ChromiumExtractorは接頭辞「/」でネストされたリソースにアクセスできません。ですから私は "chromium-mac.zip"としてリソースにアクセスできますが、ライブラリはアクセスできません。

入れ子にされたジッパー付きのクロムアーチファクトを正しいディレクトリに解凍しようとしましたが、これは有効な解決策にはなりません。だから私は図書館が人工物を抽出する方法をまとめようとしてきましたが、コードがわかりにくいので面倒です。

jxbrowserプラグインには、実行時にアーティファクトを取得するためのサポートがありますか。そのようなサポートを追加できますか(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() 

}

関連する問題