我正在运行 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 组件。在我的系统中,当我安装软件包时,会创建一个文件。该文件的内容是(跳过了一些行)java
javaws
jinfo
javah
.jinfo
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
)作为默认设置。假设 JDK 已正确安装,并且它在.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
.jinfo
github 上的一个旧文件那些在哪里jre
和jdk
。
文件的修复.jinfo
。
因此,要修复它,您需要更改hl
并jdkhl
s。如果您的文件正在.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
现在,检查java
和javac
版本。
答案2
/etc/environment
正如您所见,我的 PATH 在某种程度上受到文件的影响:
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 配置中,您可以看到以下摘录:
PATH="/usr/l...sbin:/usr/bin:/sbi..."
我不知道那是什么意思。不过,通过遵循命令提供的目标,which
我找到了一组可执行文件的链接。查看这些链接的目标,我得到了类似这样的信息:
/etc/alternatives/java
不确定下一步怎么做。复制这些链接,备份或删除它们。下一步是反复试验和谷歌搜索。我还没有谷歌搜索过javac -version
和之间的区别,which
但我应该
HTH,感谢BryceAtNetwork23