为什么通过双击启动时 jar 文件没有从磁盘读取的权限 - 但如果从终端启动则没有权限?

2023-11-22

在全新安装 Big Sur 和 AdoptOpenJDK 11 的 MacBook Pro (2015) 上,我开发了一个使用 JFileChooser 的用于教育目的的 Java 程序。我没有使用任何 IDE 特定的代码。由于程序的其余部分并不重要,这里是一个对我产生相同问题的最小示例(注意:这里仅作为示例,单击按钮将打开文件选择器,选择一个文件并单击“确定”将更改按钮的文本为“确定”):

import javax.swing.*;
import java.awt.event.*;

public class Test extends JFrame implements ActionListener {

  private JFileChooser jf;
  private JButton jb;

  public Test() {
    setSize(480,320);    
    jf = new JFileChooser();
    jf.setDialogType(JFileChooser.OPEN_DIALOG);
    jb = new JButton("CLICK ME");
    jb.addActionListener(this);
    add(jb);
    setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
    if (e.getSource().equals(jb)) {
        jf.setVisible(true);
        final int result = jf.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
          jb.setText("OK");
        }
    }
  }

  public static void main(String[] args) {
      new Test();
  }
}

如果我启动程序通过终端 (java Test或编译为 jarjava -jar Test.jar) 一切正常。我可以打开文件选择器,它会显示磁盘上的文件和文件夹。

如果我开始编译通过双击jar,程序也会启动,但是如果我打开文件选择器我看不到磁盘上的任何文件因此我无法将数据加载和保存到磁盘。

由于我只在 Mac 上遇到这些问题(不在 Windows 10 或 Lubuntu Linux 上),这可能是由于 Mac 上错误的 Java 设置而导致的一个非常具体的问题。但是,由于我安装了 Big Sur 的全新副本和 AdoptOpenJDK 11 for Mac 且没有进行任何更改,我想知道其他想要运行我的程序的人(教师和学生)是否会出现此问题。

那么问题可能是什么以及如何解决这个问题(对于我和其他人来说)?

我已经通过活动监视器发现双击的 jar 已通过 JavaLauncher 加载(但我在磁盘上找不到它,并且无法更改任何系统设置)。

我也在这里搜索过类似的问题。但这些大多与将文件保存在错误的路径有关。

找到解决方案会很高兴。谢谢您的回答!


我遇到了同样的问题 - 几年前我编写了一个 java-for-all-desktops jar 应用程序,它在所有 java 版本、所有 Mac OS 和 Windows 上都运行良好,直到我将 jar 文件放在 Big Sur (OSX 11.2) 上,此时它无法从常规文件系统读取或写入常规文件系统。就其本身而言,它默认仅读取和写入 /private/var... 中的 tmp 区域,而不是读取和写入包含 jar 文件的目录,并可以选择使用 jFileChooser 在真实文件系统中移动。如果我明确地将其设置为桌面上的开头,那么它可以移动到不同的目录,但看不到或访问文件。

经过几个小时的努力后,我根据上面的一些内容找到了如何修复它(谢谢!)...原始海报非常接近!

我发现在 /System/Library/CoreServices/Jar Launcher.app 中双击 JAR 文件时会启动该程序

通过进入系统偏好设置 -> 安全 -> 隐私 -> 完整磁盘访问,我能够导航到上述 Jar Launcher.app 并将其添加到列表中,然后可以双击我的 jar 文件并像往常一样使用完整磁盘访问访问文件系统:)

不需要它来解决我的问题,因为,正如你们上面所说的那样,java似乎从终端或Jar Launcher继承了它的访问权限,但如果有人需要,您也可以添加java本身及其任何模块到完整磁盘访问列表(如上所述)。最简单的方法是使用 java -jar YourProgram.jar 从终端启动 jar,然后,当 jar 出现在 Dock 中时,右键单击它并单击“在 Finder 中打开”。这将打开包含 java 可执行文件的文件夹。然后您可以用鼠标选择它们并将它们直接拖到“完整磁盘访问”列表中。我一路上尝试过,但是通过双击罐子来使罐子正常工作既不够也没有必要。享受!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么通过双击启动时 jar 文件没有从磁盘读取的权限 - 但如果从终端启动则没有权限? 的相关文章

  • 为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?

    为什么下面的代码没有报告 Intellij IDEA 的未经检查的警告jdk 1 8 0 121自从Supplier
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • XCode 4.2.1 在 Lion 10.7.2 上启动时崩溃

    这周我买了大约 10 年来的第一台 Mac 是的 这是一台二手 Mac Pro 2x2GHz 双核 Xeon 2GB RAM 它全新安装了 Mac OS X Lion 10 7 2 我只安装了 OmniOutlner Pro Textmat
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi

随机推荐