Linux 平台是否仅支持 Gnome 桌面的 Desktop#browse?
Is Desktop#browse supported on Linux platform just for Gnome desktop?
运行 我的 Java 使用此代码的应用程序:
if (Desktop.isDesktopSupported())
{
Desktop d = Desktop.getDesktop();
try
{
d.browse(new URI("someurl")); // someurl is just an example, I am opening real url
}
catch (IOException | URISyntaxException e)
{
logger.warn(ExceptionUtils.getStackTrace(e));
}
}
导致应用程序在 Manjaro Linux KDE 上没有响应(可能死锁)。虽然它在 Windows 上没有问题,但我不想在我的应用程序中检查 OS 并只允许它用于 Windows。我还没有尝试过其他平台。
我用的是什么:
- 领养 JDK 11
- Manjaro 内核 5.10.83-1-MANJARO 64 位
- KDE 等离子 5.23.4
- Qt 5.15.2
详细死锁位置:
Desktop
class:
public void browse(URI uri) throws IOException {
checkAWTPermission();
checkExec();
checkActionSupport(Action.BROWSE);
Objects.requireNonNull(uri);
peer.browse(uri); // <- goes here
}
死锁发生在 XDesktopPeer
class 中,它在方法 gnome_url_show(...)
上实现了 DesktopPeer
接口 (peer):
private void launch(URI uri) throws IOException {
byte[] uriByteArray = ( uri.toString() + '[=13=]' ).getBytes();
boolean result = false;
XToolkit.awtLock();
try {
if (!nativeLibraryLoaded) {
throw new IOException("Failed to load native libraries.");
}
result = gnome_url_show(uriByteArray); // <- deadlock / app not responding here
} finally {
XToolkit.awtUnlock();
}
if (!result) {
throw new IOException("Failed to show URI:" + uri);
}
}
所以... Linux 平台是否仅支持 Gnome 桌面的 Desktop#browse?
我猜是这样,因为那个方法名。
如果是,我可以检查我的代码周围是否存在死锁,以便在我的应用程序中防止出现这种情况吗?而不是检查 OS 和发行版?
SO 上已经有几个关于该问题的问题:
- Desktop browse does not work in java for Ubuntu
还有这样的讨论:
https://bugs.launchpad.net/ubuntu/+source/openjdk-8/+bug/1574879
有人说:
gnome_url_show is actually in libgnome-2-0 package
因此,如果缺少包,Desktop.browse()
将失败。有 2 个解决方案可以解决这个问题。
解决方案 1
安装 libgnome 软件包。
解决方案 2
执行xdg-open打开URL,例如:
Runtime.getRuntime().exec(new String[]{"xdg-open", someurl});
运行 我的 Java 使用此代码的应用程序:
if (Desktop.isDesktopSupported())
{
Desktop d = Desktop.getDesktop();
try
{
d.browse(new URI("someurl")); // someurl is just an example, I am opening real url
}
catch (IOException | URISyntaxException e)
{
logger.warn(ExceptionUtils.getStackTrace(e));
}
}
导致应用程序在 Manjaro Linux KDE 上没有响应(可能死锁)。虽然它在 Windows 上没有问题,但我不想在我的应用程序中检查 OS 并只允许它用于 Windows。我还没有尝试过其他平台。
我用的是什么:
- 领养 JDK 11
- Manjaro 内核 5.10.83-1-MANJARO 64 位
- KDE 等离子 5.23.4
- Qt 5.15.2
详细死锁位置:
Desktop
class:
public void browse(URI uri) throws IOException {
checkAWTPermission();
checkExec();
checkActionSupport(Action.BROWSE);
Objects.requireNonNull(uri);
peer.browse(uri); // <- goes here
}
死锁发生在 XDesktopPeer
class 中,它在方法 gnome_url_show(...)
上实现了 DesktopPeer
接口 (peer):
private void launch(URI uri) throws IOException {
byte[] uriByteArray = ( uri.toString() + '[=13=]' ).getBytes();
boolean result = false;
XToolkit.awtLock();
try {
if (!nativeLibraryLoaded) {
throw new IOException("Failed to load native libraries.");
}
result = gnome_url_show(uriByteArray); // <- deadlock / app not responding here
} finally {
XToolkit.awtUnlock();
}
if (!result) {
throw new IOException("Failed to show URI:" + uri);
}
}
所以... Linux 平台是否仅支持 Gnome 桌面的 Desktop#browse?
我猜是这样,因为那个方法名。
如果是,我可以检查我的代码周围是否存在死锁,以便在我的应用程序中防止出现这种情况吗?而不是检查 OS 和发行版?
SO 上已经有几个关于该问题的问题:
- Desktop browse does not work in java for Ubuntu
还有这样的讨论:
https://bugs.launchpad.net/ubuntu/+source/openjdk-8/+bug/1574879
有人说:
gnome_url_show is actually in libgnome-2-0 package
因此,如果缺少包,Desktop.browse()
将失败。有 2 个解决方案可以解决这个问题。
解决方案 1
安装 libgnome 软件包。
解决方案 2
执行xdg-open打开URL,例如:
Runtime.getRuntime().exec(new String[]{"xdg-open", someurl});