在Ubuntu 12.04上配置Java虚拟机的标准位置是什么?

我正在运行Pangolin(12.04 LTS)并希望找出一些Java内容,我的JVM指向我编译器的不同位置。

为了演示,我的JVM如下:

pcrow@pcrow-HP-notebook:~/Documents$ java -version java version "1.6.0_27" OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.4) OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) 

而我的编译器在这里指出:

 pcrow@pcrow-HP-notebook:~/Documents$ javac -version javac 1.7.0_51 

我通过在~/.profile文件中添加一个条目来配置后者。 问题是,我不确定前者是什么,我希望它们保持一致。 在’/ etc / environment’中,我有以下条目:

 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" 

当我运行printenv | grep "java" printenv | grep "java"

 PATH=/usr/share/maven/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-7-openjdk-amd64/bin JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 

你能告诉我IcedTea6最有可能在Ubuntu上设置的位置吗? 如果可以,我想覆盖它,并确保我的JVM和编译器都使用相同的版本。

从你的最后一段开始

你能告诉我IcedTea6最有可能在Ubuntu上设置的位置吗? 如果可以,我想覆盖它,并确保我的JVM和编译器都使用相同的版本。

Ubuntu提供了一个很好的工具,可以从多个安装中选择一个JDK / JRE。 这是update-java-alternatives 。 它与update-alternatives工具密切相关。

每个JDK / JRE都包含一组java工具,如javacjavajavawsjinfojavah等。安装可能带有隐藏的.jinfo文件,其中列出了这些java组件。 在我的系统中,当我安装openjdk-8-jdk软件包时,会创建一个文件/usr/lib/jvm/.java-1.8.0-openjdk-amd64.jinfo 。 该文件的内容是(跳过一些行)

 name=java-8-openjdk-amd64 alias=java-1.8.0-openjdk-amd64 priority=1081 section=main hl rmid /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmid hl java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java hl keytool /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool hl jjs /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/jjs hl pack200 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/pack200 hl rmiregistry /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmiregistry . . . (skipped lines) . . jdkhl jdb /usr/lib/jvm/java-8-openjdk-amd64/bin/jdb jdkhl serialver /usr/lib/jvm/java-8-openjdk-amd64/bin/serialver jdkhl wsgen /usr/lib/jvm/java-8-openjdk-amd64/bin/wsgen jdkhl jcmd /usr/lib/jvm/java-8-openjdk-amd64/bin/jcmd jdk appletviewer /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer jdk jconsole /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole plugin mozilla-javaplugin.so /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so 

update-java-alternatives使用此文件在/etc/alternatives目录中创建替代链接。 此目录的目的是提供一种机制,您可以通过该机制从一组类似工具中选择默认程序。 这适用于多个版本的JDK(请参阅update-alternatives

简要讨论update-alternatives

简要说明这个过程。 首次安装程序时,它会在备用数据库中注册其主名称(如javac )的替代项(这包含在/var/lib/dpkg/alternatives目录中)。 在安装过程中, update-alternatives/usr/bin/javac创建一个指向/etc/alternatives/javac的主链接,该链接也是指向JDK中实际文件的符号链接。

现在,当你安装另一个JDK时,这也将有一个javac程序。 因此,在安装第二个JDK update-alternatives自动更新/etc/alternatives/javac符号链接以指向具有最高优先级的符号链接。 它还会更新备用数据库,以便您可以通过调用它来手动选择默认值。

回到update-java-alternatives

update-java-alternatives使用update-alternatives从单个JDK / JRE安装中提供整个集合的默认值。 我们的想法是您将选择JDK / JRE安装,并且该JRE / JDK中的所有工具将用作提供多个Java工具的默认工具,从而使您无需使用每个工具的update-alternatives 。 因此,当您使用update-java-alternatives选择JDK时,例如openjdk-8-jdk ,它会将此JDK的java工具(例如javacjavajavaws等)作为默认值。 .jinfo是JDK已正确安装,并在.jinfo文件中列出其工具

TL; DR

因此,简单地回答您的查询,IcedTea6插件在.jinfo文件中配置, update-java-alternatives使用该文件更新链接以指向它。 因此,您需要为JDK创建一个列出插件和所有Java工具的文件,并使用update-java-alternatives

如果您手动安装了JDK / JRE,请检查此问题以获取帮助,以便通过update-java-alternatives工具识别它。

  • 如何使java默认为手动安装的JRE / JDK?

但是我们还有问题……

看来这个update-java-alternatives最近不再更新JDK组件了。 它只是更新JRE的工具。 有很多抱怨说使用此工具不会更新所有java组件。 在遇到同样的问题并花了将近5个小时之后,我想我已经找到了解决办法。 解决方案是在.jinfo文件jdkhl hl更改为jre ,将jdkhljdk 。 我在github上找到了一个旧的.jinfo文件,那里有jrejdk

.jinfo文件的修复程序。

所以,要修复它,你需要改变hljdkhl 。 如果您的文件是/usr/lib/jvm/ .openjdk-8-jdk.jinfo ,请使用此命令

 sudo sed -i 's/^hl/jre/p' /usr/lib/jvm/.openjdk-8-jdk.jinfo sudo sed -i 's/^jdkhl/jdk/p' /usr/lib/jvm/.openjdk-8-jdk.jinfo 

现在更新,首先列出备选方案

 sudo update-java-alternatives -l 

它会返回这样的内容(实际回复可能会有所不同)

 java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64 jdk1.8.0_65 1081 /usr/lib/jvm/jdk1.8.0_65 

从第一列复制备用名称并使用它来设置默认值。 要将jdk1.8.0_65设置为默认值我会使用

 sudo update-java-alternatives -s jdk1.8.0_65 -v 

现在,检查javajavac版本。

我的PATH在某种程度上受文件/etc/environment影响,如您所见:

 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" 

当我执行which javawhich javac我看到如下内容:

 /usr/bin/java 

现在,我无法确定这两者是否相关。*但作为Java开发人员,我经常向Path添加内容 – 这是我们如何影响CLASSPATH以便我们的Java类可用。 在上面的路径配置中,您会看到以下摘录:

 PATH="/usr/l...sbin:/usr/bin:/sbi..." 

我不知道这意味着什么。 然而,通过遵循由which命令给我的目标which我来到一组可执行文件的链接。 看看这些链接的目标,我得到类似的东西:

 /etc/alternatives/java 

不确定下一步。 复制这些链接,备份或删除它们。 接下来的步骤将是一些试验和错误以及谷歌搜索。 我没有用谷歌搜索javac -version之间的区别which但我应该这样做

HTH并感谢BryceAtNetwork23