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

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"

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 和编译器都使用相同的版本。

答案1

从最后一段开始

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

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

每个 JDK/JRE 都包含一组 Java 工具,例如、、、等javac。安装可能附带一个隐藏文件,其中列出了这些 Java 组件。在我的系统中,当我安装软件包时,会创建一个文件。该文件的内容是(跳过了一些行)javajavawsjinfojavah.jinfoopenjdk-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)作为默认设置。假设 JDK 已正确安装,并且它在.jinfo文件中列出了其工具

总结

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

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


但我们仍然存在问题...

似乎update-java-alternatives最近不再更新 JDK 组件了。它只更新 JRE 的工具。有很多抱怨说使用此工具不会更新所有 Java 组件。在遇到同样的问题并花了近 5 个小时后,我想我找到了解决办法。解决方案只是将文件中的更改hljre和更改jdkhl为。我发现jdk.jinfo.jinfogithub 上的一个旧文件那些在哪里jrejdk

文件的修复.jinfo

因此,要修复它,您需要更改hljdkhls。如果您的文件正在.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

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

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版本。

答案2

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

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 配置中,您可以看到以下摘录:

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

我不知道那是什么意思。不过,通过遵循命令提供的目标,which我找到了一组可执行文件的链接。查看这些链接的目标,我得到了类似这样的信息:

/etc/alternatives/java

不确定下一步怎么做。复制这些链接,备份或删除它们。下一步是反复试验和谷歌搜索。我还没有谷歌搜索过javac -version和之间的区别,which但我应该


HTH,感谢BryceAtNetwork23


相关内容