在我的自动更新程序应用程序中,我正在下载一个包含新的 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/