更新:推荐使用Jar2App打包,更为方便。
https://github.com/Jorl17/jar2app
以下为原本的答案(不推荐,兼容性不好且麻烦)
很多小型的Java应用使用JarBundler打包,这种应用的Contents/MacOS/内通常会有一个JavaApplicationStub的程序。当运行该App时,会弹出需要安装Java 6的通知。然而,如果Mac上装了新版本的Oracle Java,按照指示安装Java 6时会提示磁盘中已安装了更新版本的Java而无法安装。这里采用一个修改plist文件+手写运行jar程序的方式来解决问题。
准备工作
首先在Finder中找到打不开的App,在选单中点击显示包内容,并在包内某处找到.jar文件,记下路径(这里以Logisim为例,是Contents/Resources/Java/logisim.jar)。如果可以直接运行该jar,一般就可以继续使用下面的方法。
修改plist文件
用文本编辑器打开Contents/Info.plist文件。尝试将<key>Java</key>一项中的Java改为其它字串,并启动App。如果仍然无法启动,请继续下面的步骤,或尝试修改其它带有Java字样的key。
编写启动程序
Contents/MacOS中一般会有一个JavaApplicationStub的程序(可在Info.plist中的CFBundleExecutable项查看运行的是哪个程序),这个JarBundler项目已经很旧了,我们需要自己动手做一个运行jar的程序。注意,如果在终端中无法执行java命令,可能需要按照提示安装JDK。
运行jar的命令是
java -jar PATH_TO_JAR/xxx.jar
这里使用C++(C)编写可执行文件。jar文件的路径需要按照实际修改。
#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <mach-o/dyld.h>
int main() {
char path[1024];
char cmd[100];
strcpy(cmd, "java -jar ");
uint32_t size = sizeof(path);
if (_NSGetExecutablePath(path, &size) == 0) {
strcpy(strrchr(path, '/'), "/../Resources/Java/logisim.jar");
system(strcat(cmd, path));
} else {
printf("Error: Buffer too small. Size required: %u.\n", size);
}
}
编译后将可执行文件放到Contents/MacOS/下,再回到plist文件中,修改CFBundleExecutable项下方的值为可执行文件的名字(这里是runJar)。
<key>CFBundleExecutable</key>
<string>runJar</string>
保存plist,就可以运行App啦!