Jxbtrowser 在运行时检索平台特定的工件
Jxbtrowser retrieve platform specific artefact at runtime
我正在编写一个 intelij 插件,并希望在运行时下载特定于平台的工件。
我已经将特定于平台的 jar 加载到 class 加载程序中,但是 ChromiumExtractor 在以“/”为前缀时无法访问嵌套资源。所以我可以作为 "chromium-mac.zip" 访问资源,但图书馆不能。
我尝试将嵌套的压缩铬工件解压缩到正确的目录中,但这并没有产生有效的解决方案。所以现在我一直在尝试拼凑库提取人工制品的方式,但由于代码被混淆,这相当乏味。
jxbrowser 插件是否支持在运行时检索人工制品。是否可以添加此类支持(jxbtrowser 开发人员使用 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
}
下面的技巧,资源 jar 必须与客户端 jar(以及许可证)在同一个 class 加载器中。如果 JxBrowser 为此添加一个能够执行下载和初始化 Chromium 的帮助程序,那将会很好,也许只需要一个持久存储目录的路径。
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()
}
我正在编写一个 intelij 插件,并希望在运行时下载特定于平台的工件。
我已经将特定于平台的 jar 加载到 class 加载程序中,但是 ChromiumExtractor 在以“/”为前缀时无法访问嵌套资源。所以我可以作为 "chromium-mac.zip" 访问资源,但图书馆不能。
我尝试将嵌套的压缩铬工件解压缩到正确的目录中,但这并没有产生有效的解决方案。所以现在我一直在尝试拼凑库提取人工制品的方式,但由于代码被混淆,这相当乏味。
jxbrowser 插件是否支持在运行时检索人工制品。是否可以添加此类支持(jxbtrowser 开发人员使用 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
}
下面的技巧,资源 jar 必须与客户端 jar(以及许可证)在同一个 class 加载器中。如果 JxBrowser 为此添加一个能够执行下载和初始化 Chromium 的帮助程序,那将会很好,也许只需要一个持久存储目录的路径。
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()
}