【问题标题】:File permissions denied when unzipped with java application, manually works fine使用java应用程序解压缩时文件权限被拒绝,手动工作正常
【发布时间】:2018-12-06 22:16:16
【问题描述】:

所以我有两个应用程序。

  • 1) 启动器应用程序下载客户端应用程序版本 (v2、v3、v3 等)。
    • 2) 最终用户使用的客户端。

工作流程基本上是打开启动器,然后选择一个客户端版本来运行。

ProcessBuilder processBuilder = new ProcessBuilder(revision.getPath() + "/" + AutoUpdate.OSX_EXE);
AutoUpdate.process = processBuilder.inheritIO().start();

客户端使用 jxBrowser 并需要下载/提取所需的二进制文件。但是,当我下载 .zip 并解压缩并为可执行文件设置文件权限并从启动器中运行它时,它不起作用。

但是当我下载 .zip 版本并自己解压缩并在没有启动器的情况下运行它时,它工作正常吗?

这是一个使用 excelsiorjet 编译为本机的 java 应用程序。

这是我得到的错误:

    Caused by: com.teamdev.jxbrowser.chromium.internal.ChromiumExtractorException: Failed to extract Chromium binaries into /var/folders/kb/f884blms2g56m8xscqnsg9jh0000gn/T/jxbrowser-chromium-60.0.3112.113.6.16
    at com.teamdev.jxbrowser.chromium.internal.ChromiumExtractor.extractChromiumBinariesIfNecessary(Unknown Source)
    at com.teamdev.jxbrowser.chromium.internal.ipc.IPC.<init>(Unknown Source)
    at com.teamdev.jxbrowser.chromium.internal.ipc.IPC.create(Unknown Source)
    at com.teamdev.jxbrowser.chromium.internal.ipc.IPC$a.<clinit>(Unknown Source)
    ... 4 more
Caused by: java.lang.RuntimeException: java.io.IOException: Cannot run program "/var/folders/kb/f884blms2g56m8xscqnsg9jh0000gn/T/jxbrowser-chromium-60.0.3112.113.6.16/7zr-mac": error=13, Permission denied
    at com.teamdev.jxbrowser.chromium.internal.XZExtractor.extract(Unknown Source)
    at com.teamdev.jxbrowser.chromium.internal.b.run(Unknown Source)
    at java.security.AccessController.<unknown>(Unknown Source)
    ... 8 more
Caused by: java.io.IOException: Cannot run program "/var/folders/kb/f884blms2g56m8xscqnsg9jh0000gn/T/jxbrowser-chromium-60.0.3112.113.6.16/7zr-mac": error=13, Permission denied
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at com.teamdev.jxbrowser.chromium.internal.xz.XZ.decompress(Unknown Source)
    ... 11 more
Caused by: java.io.IOException: error=13, Permission denied
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)

这是我更改权限的代码:

    if(AutoUpdate.OS.equalsIgnoreCase("OSX")){
        File exe = new File(localPath + AutoUpdate.OSX_EXE);
        exe.setReadable(true);
        exe.setExecutable(true);
        exe.setWritable(true);
        File folder = new File(localPath + "rt");
        folder.setReadable(true);
        folder.setExecutable(true);
        folder.setWritable(true);
    }
    else{
        File exe = new File(localPath + AutoUpdate.WINDOWS_EXE);
        exe.setReadable(true);
        exe.setExecutable(true);
        exe.setWritable(true);
        File folder = new File(localPath + "rt");
        folder.setReadable(true);
        folder.setExecutable(true);
        folder.setWritable(true);
    }

【问题讨论】:

  • 您用来运行Java应用程序的用户是否拥有/var/folders/kb目录的权限?
  • 我相信其中一个库创建了该文件夹/目录,所以我不确定它是否存在。奇怪的是,如果我只是正常下载+解压缩应用程序,它会很好地创建该文件夹。但是,如果我从包装器启动器中解压缩并运行应用程序,它会拒绝访问。

标签: java file permissions


【解决方案1】:

我通过 Build 在 MAC 机器上遇到了同样的问题。如果我通过 STS/Eclipse 运行它,它工作正常。我使用了以下内容:

  • JRE - jre1.8.0_232_windows(OpenJDK 服务器虚拟机 MAC 上的 Corretto-8.232.09.1) 和 Corretto-8.232.09.2,
  • JxBrowser 7.3 版,
  • MAC 10.14(莫哈韦) 我通过授予 \lib 文件夹(我的 jxBrowser 文件所在的位置)的可执行权限解决了这个问题。 \bin 文件夹权限代码已经存在。可以参考以下代码。

    if(OSDetector.isMacOSX()) {
        String binPath = new File(new File(lJreVersion, "bin").toString()).getAbsolutePath();
        String libPath = new File(new File(lJreVersion, "lib").toString()).getAbsolutePath();
        logger.info("getSpecifiedJavaExecutable() => " + binPath);
        setExecutable(binPath);
        setExecutable(libPath);
            }
    
    
    
    private void setExecutable(String path){        
        File folder = new File(path);
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
            System.out.println("File " + listOfFiles[i].getName());
            listOfFiles[i].setExecutable(true);
        } else if (listOfFiles[i].isDirectory()) {
            System.out.println("Directory " + listOfFiles[i].getName());
        }
    }
    

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 2023-04-04
    • 2016-10-06
    • 2018-01-09
    • 2017-09-06
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多