java - 使用 java 应用程序解压缩时文件权限被拒绝,手动工作正常

标签 java file permissions

所以我有两个应用程序。

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

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

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

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

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

这是一个使用 excelsiorjet 编译为 native 的 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);
    }

最佳答案

我通过 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( Mojave ) 我通过向\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());
        }
    }
    

关于java - 使用 java 应用程序解压缩时文件权限被拒绝,手动工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072582/

相关文章:

java - Tapestry 内部重定向到静态页面

java - 将 mp3 解码为 pcm,并在 Google Android 中播放音轨

c++ - 来自 cpp 文件的部分行最终出现在输出文件中 - 闹鬼代码?

java - 如何检查不同类型的扫描仪字符串拆分

php - 403 禁止尝试执行 php 脚本

java - 为什么以这种方式使用 "static"类?

Java线程性能

java - 当我使用 Gdx.files.local(path) 时,Gdx 在哪里搜索?

linux - AWS亚马逊Linux EC2实例: apache user permission denied for write to directories

使用 gem 通过 RVM 安装 Rails 时出现权限错误