【问题标题】:Is Desktop#browse supported on Linux platform just for Gnome desktop?Linux 平台是否仅支持 Gnome 桌面的 Desktop#browse?
【发布时间】:2022-01-17 18:31:02
【问题描述】:

使用此代码运行我的 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 上没有问题,但我不想在我的应用程序中检查操作系统并只允许它用于 Windows。我还没有尝试过其他平台。

我用什么:

  • 采用 JDK 11
  • Manjaro 内核 5.10.83-1-MANJARO 64bit
  • KDE 等离子 5.23.4
  • Qt 5.15.2

详细死锁位置:

Desktop类:

public void browse(URI uri) throws IOException {
        checkAWTPermission();
        checkExec();
        checkActionSupport(Action.BROWSE);
        Objects.requireNonNull(uri);
        peer.browse(uri); // <- goes here
    }

死锁发生在在方法gnome_url_show(...) 上实现DesktopPeer 接口(peer)的XDesktopPeer 类中:

private void launch(URI uri) throws IOException {
        byte[] uriByteArray = ( uri.toString() + '\0' ).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?

我猜这个,因为那个方法名。

如果是,我可以检查我的代码是否存在死锁,以便在我的应用程序中防止这种情况发生吗?而不是检查操作系统和发行版?

【问题讨论】:

    标签: java awt deadlock gnome manjaro


    【解决方案1】:

    关于这个问题已经有几个关于 SO 的问题:

    还有这样的讨论:

    https://bugs.launchpad.net/ubuntu/+source/openjdk-8/+bug/1574879

    有人说:

    gnome_url_show 实际上在 libgnome-2-0 包中

    因此,如果包丢失,Desktop.browse() 将失败。有两种解决方案可以解决此问题。

    解决方案 1

    安装 libgnome 包。

    解决方案 2

    执行xdg-open打开网址,例如:

    Runtime.getRuntime().exec(new String[]{"xdg-open", someurl});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2019-03-14
      相关资源
      最近更新 更多