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。我还没有尝试过其他平台。

我用的是什么:

详细死锁位置:

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});