Java 将压缩的 .app 解压回 .app (OS X)

标签 java macos

在我的自动更新程序应用程序中,我正在下载一个包含新的 MyApp.app 应用程序文件的压缩文件。所以我正在下载 MyApp.zip.. 然后我使用以下类来尝试解压缩它:

package update;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

public class UnZip {

  public static final void copyInputStream(InputStream in, OutputStream out)
  throws IOException
  {
    byte[] buffer = new byte[1024];
    int len;

    while((len = in.read(buffer)) >= 0)
      out.write(buffer, 0, len);

    in.close();
    out.close();
  }

  public static final void unZipIt(String F1, String F2) {
    Enumeration entries;
    ZipFile zipFile;

    try {
      zipFile = new ZipFile(F1);

      entries = zipFile.entries();

      while(entries.hasMoreElements()) {
        ZipEntry entry = (ZipEntry)entries.nextElement();

        if(entry.isDirectory()) {
          // Assume directories are stored parents first then children.
          System.err.println("Extracting directory: " + entry.getName());
          // This is not robust, just for demonstration purposes.
          (new File(entry.getName())).mkdirs();
          continue;
        }

        System.err.println("Extracting file: " + entry.getName());
        copyInputStream(zipFile.getInputStream(entry),
           new BufferedOutputStream(new FileOutputStream(entry.getName())));
      }

      zipFile.close();
    } catch (IOException ioe) {
      System.err.println("Unhandled exception:");
      ioe.printStackTrace();
      return;
    }
  }

   }

但是解压后应用程序将无法启动..有什么想法吗?

最佳答案

您的可执行文件很可能未标记为可执行文件。诀窍是 .app "file"实际上是目录,因此使它们可执行没有实际目的,您需要找到实际的二进制文件。

为此,您需要打开 ./myApp.app/Contents/Info.plit 并查找 CFBundleExecutable 键:关联的字符串是我相信,相对于 ./myApp.app/Contents/MacOS 的可执行文件。

找到该文件后,chmod +x 它,并检查您的应用程序是否仍然无法启动。

如果没有,问题就解决了。

如果是这样,请尝试通过 open ./myApp.app 命令从终端打开您的应用程序。如果打印出任何奇怪的内容,请用它更新您的问题并让我们知道那是什么。

如果所有其他方法都失败,请查看Console应用程序中是否有有趣的日志条目 - 您可以搜索应用程序的名称,看看是否会出现任何内容。

关于Java 将压缩的 .app 解压回 .app (OS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865933/

相关文章:

java - 如何使用 Vert.x 从 EventBus 中获取结果

java - 是否可以按子字符串拆分而不删除它?

java - 无法在 AlertDialog/LoginDialog 期间隐藏导航栏

objective-c - 根据 NSTableView 选择过滤核心数据项?

xcode - 如何解决 XCode 滑动手势转到上一个/下一个文件卡住编辑器?

objective-c - Objective C 中的天数列表

android - 在 OS X 上为 Cordova 应用程序构建 Ant 项目时出现目标不存在错误

java - 如何执行带有变量作为 WHERE 的 SQL 语句?

java - 固定大小的Java栈

macos - 如何为 Mac 创建菜单栏应用程序