使用JabRef,我们遇到一种奇怪的情况,一些用户在启动JabRef时遇到以下错误
我们不会在我们的应用程序中发送JRE,而是依赖于用户机器上安装的Java。
关于这个特殊错误我们有很长的issue on 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
我要求此特定用户提供INSTALL4J_LOG
,以便我们可以将{4}}上的Install4J的日志文件与其失败的my machine进行比较。
我的机器运行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"
)
这正是我们在Install4J中配置的顺序
在用户日志文件中,此部分完全丢失。但是,它并不重要,因为JRE / JDK很少包含在$PATH
变量中。接下来要检查的是默认位置,这将首先在Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
中找到JRE。
因此,在我的机器和用户机器上,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 ()
之后,日志看起来很相似,但是当最终调用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
)
现在,我不确定为什么需要解压缩,以及是否可以通过特定的JRE或不同的Mac OS版本来解释。
无论如何,我已要求用户安装Oracle JRE 1.8.0_161,以便我们都拥有完全相同的Java,如果能解决问题,我会报告。
然而,有人明白为什么Install4J发射器会崩溃吗?