带有 Java Swing(IntelliJ 插件)的 JxBrowser - "Received signal 10 BUS_ADRERR"
JxBrowser with Java Swing (IntelliJ plugin) - "Received signal 10 BUS_ADRERR"
我正在编写一个 IntelliJ 插件,并试图通过 Java Swing 将 JxBrowser 集成到插件工具 window 中。
我正在使用 toolWindow 扩展来简化工具 window 集成。
plugin.xml
<extensions defaultExtensionNs="com.intellij">
<toolWindow id="pluginid" anchor="right" factoryClass="com.solutionloft.codeclippy.MainWindowFactory" />
</extensions>
所以我的主要工厂 class 看起来像这样:
public class MainWindowFactory implements ToolWindowFactory {
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
Browser browser = new Browser();
BrowserView view = new BrowserView(browser);
Content content = toolWindow.getContentManager().getFactory().createContent(view, "", false);
toolWindow.getContentManager().addContent(content);
browser.loadHTML("<html><body><h1>Hello World!</h1></body></html>");
}
}
当我最初在本地 运行 插件时(工具 window 出现,我可以看到 Hello World),这似乎有效,但是如果我终止进程然后尝试 运行再说一遍,我运行进入这个错误:
Received signal 10 BUS_ADRERR 000103bc3000
[0x00017cd9540c]
[0x00017cd95301]
[0x7fff572eef5a]
[0x7fbe7e9f5000]
[end of stack trace]
Process finished with exit code 138 (interrupted by signal 10: SIGBUS)
我是否缺少某种清理步骤?我不确定什么仍然是 运行ning - 我目前发现的唯一解决方法是完全重新启动计算机,所以我猜某些进程一定仍然是 运行ning 导致的它发生冲突。正确的清理方法是什么?跟browser.dispose()
有关系吗?我没能找到关于何时 .dispose()
合适/是否需要的文档。
我正在使用:
* macOS High Sierra
* Java 1.8.0_151 作为我的 JDK
* PyCharm Ultimate 作为我的 JRE
谢谢!
更新:注意到如果我终止这个进程 /System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd
,问题会在接下来的 运行 秒内消失。但有时这个进程不存在,杀死一个静止的 运行ning java 进程是修复...奇怪。
根据 article,所有浏览器实例都应在您不需要时释放。请在关闭您的应用程序之前尝试处理所有浏览器实例。
根据TeamDev的支持,解决方案是设置系统属性 jxbrowser.ipc.external=true
。在创建浏览器实例之前调用 System.setProperty("jxbrowser.ipc.external", "true")
应该可以解决问题。问题是 JxBrowser 将 运行 处于轻量级模式。
您还可以确保通过 browser.dispose()
正确处理所有浏览器实例,通过 BrowserCore.shutdown()
.
正确处理 Chromium 引擎
我正在编写一个 IntelliJ 插件,并试图通过 Java Swing 将 JxBrowser 集成到插件工具 window 中。
我正在使用 toolWindow 扩展来简化工具 window 集成。
plugin.xml
<extensions defaultExtensionNs="com.intellij">
<toolWindow id="pluginid" anchor="right" factoryClass="com.solutionloft.codeclippy.MainWindowFactory" />
</extensions>
所以我的主要工厂 class 看起来像这样:
public class MainWindowFactory implements ToolWindowFactory {
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
Browser browser = new Browser();
BrowserView view = new BrowserView(browser);
Content content = toolWindow.getContentManager().getFactory().createContent(view, "", false);
toolWindow.getContentManager().addContent(content);
browser.loadHTML("<html><body><h1>Hello World!</h1></body></html>");
}
}
当我最初在本地 运行 插件时(工具 window 出现,我可以看到 Hello World),这似乎有效,但是如果我终止进程然后尝试 运行再说一遍,我运行进入这个错误:
Received signal 10 BUS_ADRERR 000103bc3000
[0x00017cd9540c]
[0x00017cd95301]
[0x7fff572eef5a]
[0x7fbe7e9f5000]
[end of stack trace]
Process finished with exit code 138 (interrupted by signal 10: SIGBUS)
我是否缺少某种清理步骤?我不确定什么仍然是 运行ning - 我目前发现的唯一解决方法是完全重新启动计算机,所以我猜某些进程一定仍然是 运行ning 导致的它发生冲突。正确的清理方法是什么?跟browser.dispose()
有关系吗?我没能找到关于何时 .dispose()
合适/是否需要的文档。
我正在使用:
* macOS High Sierra
* Java 1.8.0_151 作为我的 JDK
* PyCharm Ultimate 作为我的 JRE
谢谢!
更新:注意到如果我终止这个进程 /System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd
,问题会在接下来的 运行 秒内消失。但有时这个进程不存在,杀死一个静止的 运行ning java 进程是修复...奇怪。
根据 article,所有浏览器实例都应在您不需要时释放。请在关闭您的应用程序之前尝试处理所有浏览器实例。
根据TeamDev的支持,解决方案是设置系统属性 jxbrowser.ipc.external=true
。在创建浏览器实例之前调用 System.setProperty("jxbrowser.ipc.external", "true")
应该可以解决问题。问题是 JxBrowser 将 运行 处于轻量级模式。
您还可以确保通过 browser.dispose()
正确处理所有浏览器实例,通过 BrowserCore.shutdown()
.