在Ubunutu 14.04中安装JabRef 3.5 (安装openjdk 8)

我一直都使用JabRef作为我的文档管理软件,因为它是开源的,支持bibtex并和Latex无缝连接,支持各数据库的自动文章搜索和bibtex生成。配戴使用Git作为后台的版本控制,现在我用它管理我的所有电子书和期刊文献,并在多电脑多操作系统保持同步。

可是最近发现了一个很尴尬的问题。Jabef的最新版本需要openjdk 8才能运行,而我所使用的Linux电脑由于工作原因都运行的是Ubuntu 14.04 LTS,支持的openjdk最高版本是7。为了能安装并使用上JabRef 3.5,我最终把openjdk 8给安上了。

安装Jabref 3.5其实比较简单。首先是安装系统自有版本,如果从来没有安装过JabRef的话。

$ sudo apt-get install jabref

这样就会安装一个JabRef 2.10b,非常老的版本。不过我们需要的这个安装会建立所有的系统链接,这样就不用手动建立图标和运行脚本了。安装之后:

$ which jabref
/usr/bin/jabref
$ ls -l /usr/share/java/jabref.jar
lrwxrwxrwx 1 root root 24 Aug 4 22:36 /usr/share/java/jabref.jar -> ../jabref/JabRef-2.10b2.jar

可见JabRef被安装到了/uar/bin,但这其实是一个脚本,会自动检查Java和其他扩展包的路径然后运行jabref.jar,而jabref.jar是一个软连接,指向了JabRef-2.10b2.jar。其实这方便了我们安装JabRef 3.5。

$ cd /usr/share/jabref
$ sudo wget https://github.com/JabRef/jabref/releases/download/v3.5/JabRef-3.5.jar
$ sudo mv /usr/share/java/jabref.jar /usr/share/java/jabref.jar.old
$ sudo ln -s ../jabref/JabRef-3.5.jar /usr/share/java/jabref.jar

现在我们就把jabref.jar指向了新的JarbRef-3.5.jar。不过这时候JabRef并不能正常运行:

$ jabref
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/sf/jabref/JabRefMain : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

这里的Unsupported major.minor.version 52.0实际上就是说需要jdk 8。所以,我们需要给Ubuntu 14.04安装openjdk 8:

$ sudo add-apt-repository ppa:openjdk-r/ppa
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jre openjdk-8-jre-headless

不过这个时候系统默认的java版本仍然是openjdk 7,我们需要改变系统的默认java版本才能默认使用openjdk8:

$ sudo update-alternatives --config java

出现提示符后,请选择openjdk8的选项,这样默认java版本就被改变。

$ java -versionopenjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-0ubuntu4~14.04-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

但是很糟糕的是,JabRef仍然不能自动运行,因为JabRef使用/usr/lib/java-wrappers/jvm-list.sh这个脚本来寻找java的默认版本,为了能正确的找到默认版本,我们需要作如下的修改:

  __jvm_openjdk7="/usr/lib/jvm/java-7-openjdk-$__arch /usr/lib/jvm/java-7-openjdk"
+ __jvm_openjdk8="/usr/lib/jvm/java-8-openjdk-$__arch /usr/lib/jvm/java-8-openjdk"

  # And a few aliases
  __jvm_gcj="$__jvm_gcj2"
- __jvm_openjdk="$__jvm_openjdk7 $__jvm_openjdk6"
+ __jvm_openjdk="$__jvm_openjdk8 $__jvm_openjdk7 $__jvm_openjdk6"

现在,JabRef应该可以正常运行了。终于。