如何在Ubuntu中找到我的当前JAVA_HOME?

如何在Ubuntu中找到我的当前JAVA_HOME?在安装Maven时,我必须设置java_home路径。
10个回答

要显示JAVA_HOME变量路径,请在终端中输入:
echo $JAVA_HOME

如果什么都没有显示,那就用这个设置:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

这将根据您的JDK类型和版本而有所不同。
要再次显示它,请按照第一个命令。
要使用不同的JDK或在不同的JDK之间切换,请参考同一系统上来自不同供应商的JRE

它给出的是"/usr/lib/jvm/java-6-sun"。但我已经安装了Java 7。当我使用"java -version"进行检查时,它给出的是Java版本"1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) Server VM (build 24.45-b08, mixed mode)。 - Samitha Chathuranga
2然后执行第二个命令来设置JAVA_HOME变量。注意:JAVA_HOME并不会将jdk设置为默认值,它只是将JAVA_HOME变量设置为一个路径。如果你想在同一台机器上使用不同的jdk安装版本,请查看我的回答,我已经对其进行了编辑。 - Deepen
你应该将它设置在/etc/environment文件中。 - keiki
@Jax-L 但是现在当我输入 echo JAVA_HOME,它只显示为"JAVA_HOME"。我给出的路径没有显示出来...??? - Samitha Chathuranga
请正确阅读,它是 echo $JAVA_HOME。您忘记了美元符号($)。 - Deepen
@otakun85 在/etc/environment中进行的设置与使用export命令是相同的吗? - Samitha Chathuranga
2导出仅在重新启动之前有效。或者您可以将导出命令添加到.bashrc登录脚本中。但是正确设置此类环境变量的方式是在/etc/environment文件中。 - keiki
不,它们不一样,但是也可以通过编辑/etc/environment文件来设置。是的,在退出会话之前,它们是相同的。最好在重启时设置在/etc/environment中,你会发现JAVA_HOME。 - Deepen
那么在etc/environment中进行的设置会使其变为永久吗? - Samitha Chathuranga

如果您已经安装了JDK 1.6(对应Java 6)或更新版本,您的系统中应该有一个名为"jrunscript"的程序在您的"PATH"环境变量中。您可以使用此程序来找到相应的"JAVA_HOME"路径。示例:
$ jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'
/opt/local/jdk1.7.0_76/jre

你可以像这样设置环境变量:
$ export JAVA_HOME="$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')"

请注意,JRE不包含 jrunscript,因此只有在安装了JDK而不仅仅是JRE的情况下才能正常工作。

1那真是一番努力,才弄清楚我需要再深入一个目录,不过还是谢谢。 - cnizzardini

另一个便携选项是从java中提取JRE的绝对路径。
export JAVA_HOME=`type -p java|xargs readlink -f|xargs dirname|xargs dirname`

绝对路径 java 传递给 dirname 两次,以删除末尾的 /bin/java。完整目录提取如下:

$ type -p java
/usr/bin/java

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-8-oracle/bin/java

$ dirname /usr/lib/jvm/java-8-oracle/bin/java
/usr/lib/jvm/java-8-oracle/bin/

$ dirname /usr/lib/jvm/java-8-oracle/bin/
/usr/lib/jvm/java-8-oracle/

3可以使用type -p javac|xargs readlink -f|xargs dirname|xargs dirname(不包括导出部分)来获取目录,而无需设置它。 - steoiatsl
真是我正在寻找的!太棒了的回答! - Silviu Burcea
这里没有javac。使用java工作过。 - alanjds
1@alanjds 说得对。将答案从javac改为javajavac只在JDK中可用。 - rzymek

只需运行一个命令即可。
 sudo update-alternatives --config java

它会给出类似的东西
Es gibt nur eine Alternative in Link-Gruppe java (die /usr/bin/java bereitstellt): /usr/lib/jvm/java-8-oracle/jre/bin/java

从这个路径你可以找到java home:/usr/lib/jvm/java-8-oracle/。现在你可以将它导出为JAVA_HOME变量。
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/

现在回显$JAVA_HOME并显示它。

为了考虑到update-alternatives机制:
$ update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'

你可以像这样设置环境变量:
$ export JAVA_HOME="$(update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre')"

1这个并不完全给出JAVA_HOME,因为它仍然包含了尾部的/jre。你可以尝试使用export JAVA_HOME="$(update-alternatives --query java | grep 'Value: ' | sed -e 's/Value: //;s?/jre/bin/java??;')" - James Brusey

我在Ubuntu LTS(14.04 / 16.04)中使用这个。
[ -L /etc/alternatives/java ] && 
  export JAVA_HOME="$(readlink -f /etc/alternatives/java | sed -e 's/\/jre\/bin\/java$//')"

对于 Java 9 及更高版本:
这个答案 https://askubuntu.com/a/657468/963 使用了内置的 Nashorn JavaScript 引擎来打印出 java.home 系统属性。Nashorn 正在废弃,所以一个替代方案是使用在 Java 9 中引入的 jshell
echo 'System.out.println(java.lang.System.getProperty("java.home"));' | jshell  -

在我的Ubuntu 18.10系统上打印出来的是:
/usr/lib/jvm/java-11-openjdk-amd64


获取 JAVA_HOME 的方法:
update-alternatives --query java | grep 'Value: ' | sed 's/Value: \(.*\)\/bin\/java/\1/'

## e.g. returns  </opt/Oracle_Java/jre1.8.0_202> 
## if            </etc/alternatives/java>  points to 
##               </opt/Oracle_Java/jre1.8.0_202/bin/java>

设置JAVA_HOME的方法:
export JAVA_HOME="$(update-alternatives --query java | grep 'Value: ' | sed 's/Value: \(.*\)\/bin\/java/\1/')"

你可以使用不同的分隔符来简化阅读 sed 表达式,例如一个艾特符号:... | sed 's@Value: \(.*\)/bin/java@\1@'(这样你就不需要转义路径中的斜杠)。但对于新手来说,这看起来可能有些不寻常。 - Lenormju
1@Lenormju好观点,谢谢提醒。但是带有@的话对我来说看起来很奇怪,而且我还得解决一个已经很复杂的问题,就像你所提到的一样。不过,如果它更合适的话,我个人会选择... | sed 's|Value: \(.*\)/bin/java|\1|'(如果它能正常工作——我没有测试过)。 - Andreas Covidiot

对于支持-XshowSettings:properties的版本:
虽然alternatives可能仍然受欢迎,但我主要使用jenv,偶尔也会用到sdkman,它们都引入了一定程度的间接性;如果你愿意直接询问java本身:
java -XshowSettings:properties -version |& grep -Po '(?<=java.home = )(.*)'

这在Java 6中不可用。
docker run --rm openjdk:6 java -XshowSettings:properties -version
Unrecognized option: -XshowSettings:properties
Could not create the Java virtual machine.

自Java 7以来,它已经可用。
 dk run --rm openjdk:7 bash -c "java -XshowSettings:properties -version |& grep -Po '(?<=java.home = |java.home=)(.*)'"
/usr/lib/jvm/java-7-openjdk-armhf/jre