解决macOS中某些App需要安装Java 6环境的问题

更新:推荐使用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啦!