如果通过双击 JNLP 文件启动 JAVA Web Start 应用程序,如何允许它访问 macOS Catalina 上的文件系统?

Posted

技术标签:

【中文标题】如果通过双击 JNLP 文件启动 JAVA Web Start 应用程序,如何允许它访问 macOS Catalina 上的文件系统?【英文标题】:How to allow JAVA Web Start application to access file system on macOS Catalina if it is started by double clicking on JNLP file? 【发布时间】:2020-02-14 15:01:00 【问题描述】:

在 macOS Catalina 中,我们遇到以下问题:通过双击 JNLP 文件启动应用程序和通过双击桌面上安装的快捷方式启动应用程序时,打开 Java Web Start 应用程序的行为不同。

在第一种情况下(双击下载的 JNLP 文件)应用程序打开时没有访问文件系统的权限 - 尝试在 JAVA 代码中获取用户桌面目录中的目录列表总是返回 null。没有提示用户请求任何访问文件系统的权限。这不是预期的行为。

在第二种情况下(从桌面快捷方式启动),首先提示用户应用程序正在尝试访问文件系统并要求获得权限。当用户允许应用程序访问文件时 - 应用程序正确读取用户的桌面目录。这是预期的行为。

有解决办法吗?如果通过双击 JNLP 文件来启动 Catalina 上的 Web 启动应用程序访问文件系统(这是应用程序必须至少第一次启动的方式),我们如何使 Web 启动应用程序访问文件系统?

【问题讨论】:

【参考方案1】:

我在运行旧版 .jnlp 应用时遇到了类似问题。我可以通过简单地从 CLI(iTerm/Terminal/等)调用应用程序来解决它:

# javaws filename.jnlp

根本原因是 macOS 10.15 (Catalina) 现在要求非 Apple 应用程序被专门授予“全盘访问”权限。查看this 和this 了解详情。使用那里的解释,我将 /usr/bin/javaws(以及其他 java 二进制文件,如 java 和 appletviewer)添加到“全盘访问”,但这并没有解决问题。

基于older thread,似乎如果应用程序的路径不在 /Applications/ 下(在这种情况下,java 和 javaws 在 /System/ 下而不是 /Applications/ 下),则全盘访问不被尊重。因此,Apple 很可能需要提供修复程序以允许从 UI 运行这些应用程序。

【讨论】:

谢谢!从终端启动它也适用于我。我们可以向我们的客户建议它作为一种解决方法,直到希望 Catalina 得到修复,或者直到我们离开 Java WS,因为它无论如何都会被弃用...... 对不起,我没有完全理解这一点。那么这是否意味着 Javaws 不会启动双击 JNLP(OP 问题中的第一种情况)?如果没有,那么它是如何启动的? JNLP 启动。但是,一旦启动,它就无法在 mac OS 上读取/写入磁盘上的文件。您可以通过向“/System/Library/CoreServices/Java Web Start.app”提供“全盘访问”(系统偏好设置 > 安全和隐私)来绕过它。旁注:此解决方案在 2019 年 10 月在新发布的 MacOS Catalina 中不起作用(当时的解决方法是从命令行启动 jnlp 文件 - 例如“java ”)。【参考方案2】:

我们能够通过授予 /System/Library/CoreServices/Java Web Start.app 的完整磁盘访问权限来解决此问题

【讨论】:

怎么做?【参考方案3】:

对我来说,问题是通过安装不同版本的 Java 解决的。

【讨论】:

【参考方案4】:

我在 OSX Catalina 10.15.7 上遇到了同样的问题。我可以通过首先设置 JAVA_HOME 来启动 jnlp 文件。

export JAVA_HOME=$(/usr/libexec/java_home)
javaws /path/to/file.jnlp

【讨论】:

以上是关于如果通过双击 JNLP 文件启动 JAVA Web Start 应用程序,如何允许它访问 macOS Catalina 上的文件系统?的主要内容,如果未能解决你的问题,请参考以下文章

jnlp无法用JAVA打开,java无法启动,显示应用程序错误?

java无法启动该应用程序jnlp文件打不开

javaws.exe为啥打不开JNLP文件

JAVA万能:JNLP在浏览器上以WEB方式运行JAVA程序

已安装Java,下载jnlp文件依旧无法使用。

jar文件打开使用Java错误:启动文件中缺少下列必需字段:<jnlp>