使用JabRef,我们遇到一种奇怪的情况,一些用户在启动JabRef时会出现以下错误

我们不会使用我们的应用程序发送JRE,而是依赖于Java安装在用户的计算机上.
我们在GitHub上有一个关于这个特殊错误的长期问题,尽管我们付出了很多努力,但似乎我们找不到问题的根源.特别是,因为没有一个开发者可以重现它.幸运的是,遇到此错误的用户之一非常友好地提供有关其计算机的所有信息:
$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxr-xr-x 1 root wheel 74 Aug 14 12:09 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
1.8.0_161, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
1.8.0_121, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
$ echo $JDK_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
Run Code Online (Sandbox Code Playgroud)
我请这个特定的用户提供INSTALL4J_LOG,以便我们可以在我的机器上运行Install4J的日志文件,以及它失败的用户机器上的日志文件.我的机器运行OS X 10.13.2,用户系统是OS X 10.12.6.
它们之间有两个主要区别.第一个区别是,当我调用JabRef启动器时,它立即告诉我搜索Java的地方的顺序:
2018-01-24 02:10:14.437 JavaApplicationStub[4846:345347] -[Launcher findJavaBundle:] [Line 479] search sequence (
EPATH,
Y,
"EJAVA_HOME",
"EJDK_HOME"
)
Run Code Online (Sandbox Code Playgroud)
这正是我们在Install4J中配置的顺序

在用户日志文件中,此部分完全丢失.但是,它并不重要,因为JRE/JDK很少包含在$PATH变量中.接下来要检查的是默认位置,这将首先找到JRE Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin.因此,在我的机器和用户机器上,JabRef将使用此JRE而不是任何额外安装的JDK.
现在,可能存在更重要的差异.在用户的机器上,似乎需要解压缩JRE,这对我来说不会发生:
2018-01-23 12:27:08.320 JavaApplicationStub[40695:1133965] -[Launcher findJavaBundle:] [Line 474] Running unpacker
2018-01-23 12:27:08.323 JavaApplicationStub[40695:1133965] +[Unpacker unpack:withProgress:] [Line 24] found ()
2018-01-23 12:27:08.323 JavaApplicationStub[40695:1133965] +[Unpacker unpack:withProgress:] [Line 24] found ()
Run Code Online (Sandbox Code Playgroud)
之后,日志看起来很相似,但是当最终调用JRE时,在用户的机器上找不到它,我们收到错误消息
2018-01-23 12:27:08.328 JavaApplicationStub[40695:1133965] int launcher_main(int, char **) [Line 925] Could not load JRE from The bundle “Java SE 8” couldn’t be loaded because its executable couldn’t be located..: (
0 CoreFoundation 0x00007fff8ff882cb __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fffa4d9e48d objc_exception_throw + 48
2 CoreFoundation 0x00007fff90006c3d +[NSException raise:format:] + 205
3 JavaApplicationStub 0x0000000100008644 -[Launcher launch] + 468
4 JavaApplicationStub 0x0000000100008ef5 launcher_main + 645
5 JavaApplicationStub 0x0000000100009062 main + 34
6 JavaApplicationStub 0x0000000100001504 start + 52
)
Run Code Online (Sandbox Code Playgroud)
现在,我不确定为什么需要拆包,如果可以通过特定的JRE或不同的Mac OS版本来解释.
无论如何,我已经要求用户安装Oracle JRE 1.8.0_161,以便我们都拥有完全相同的Java,如果这解决了问题我会报告.
然而,有人明白为什么Install4J发射器会崩溃?