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

Cro*_*wie 5 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)
Run Code Online (Sandbox Code Playgroud)

而我的编译器指向这里:

pcrow@pcrow-HP-notebook:~/Documents$ javac -version
javac 1.7.0_51
Run Code Online (Sandbox Code Playgroud)

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

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
Run Code Online (Sandbox Code Playgroud)

当我跑 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
Run Code Online (Sandbox Code Playgroud)


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

Anw*_*war 6

从你的最后一段开始

你能告诉我 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
Run Code Online (Sandbox Code Playgroud)

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时,比如说,它会将这个JDK的openjdk-8-jdkjava工具(例如javac,,等)设置为默认。前提是 JDK 安装正确并且在文件中列出了其工具javajavaws.jinfo中列出了其工具。

长话短说

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

如果您手动安装了 JDK/JRE,请检查此问题以获得使其被该update-java-alternatives工具识别的帮助。


但我们仍然有问题...

update-java-alternatives最近好像不再更新JDK组件了。它只是更新 JRE 的工具。有很多抱怨称使用此工具不会更新所有 java 组件。在经历了同样的问题并花了近 5 个小时的时间后,我想我已经找到了解决办法。解决方案只是更改hl为jre和jdkhl到文件jdk中.jinfo。我在 github 上找到了一个旧.jinfo文件,其中包含jre和jdk.

文件的修复.jinfo。

因此,要修复它,您需要更改hl和jdkhls。如果您的文件正在.openjdk-8-jdk.jinfo使用/usr/lib/jvm/此命令

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
Run Code Online (Sandbox Code Playgroud)

现在要更新,首先列出替代方案

sudo update-java-alternatives -l
Run Code Online (Sandbox Code Playgroud)

它会返回类似这样的内容(实际回复可能与您不同)

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
Run Code Online (Sandbox Code Playgroud)

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

sudo update-java-alternatives -s jdk1.8.0_65 -v
Run Code Online (Sandbox Code Playgroud)

现在,检查java和javac版本。