在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工具,如javac
, java
, javaws
, jinfo
, javah
等。安装可能带有隐藏的.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工具(例如javac
, java
, javaws
等)作为默认值。 .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
,将jdkhl
为jdk
。 我在github上找到了一个旧的.jinfo
文件,那里有jre
和jdk
。
.jinfo
文件的修复程序。
所以,要修复它,你需要改变hl
和jdkhl
。 如果您的文件是/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
现在,检查java
和javac
版本。
我的PATH在某种程度上受文件/etc/environment
影响,如您所见:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
当我执行which java
和which 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