查找JAVA_HOME并在RHEL上设置

22

我之前在我的RHEL机器上安装了Java。现在,我试图运行一个需要设置JAVA_HOME变量的程序。如何找出Java安装目录的最佳方法,然后设置JAVA_HOME?以下是运行java-version的结果:

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

我有一个/usr/lib/jvm目录,但是它是空的。

7个回答

33

RHEL使用替代子系统来管理Java安装。您可以安装多个Java版本,但一次只能激活一个版本。

这意味着运行which java将不提供有用的信息。无论通过替代选择哪个Java安装,输出都将相同。运行readlink -f $(which java)(如其他评论中已经建议的)或者使用替代询问alternatives --display java会更好。

以下是在安装了OpenJDK的RHEL 6机器上的示例:

[root@example ~]# which java
/usr/bin/java
[root@example ~]# readlink -f $(which java)
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64/jre/bin/java
[root@example ~]# alternatives --display java | head -2
java - status is manual.
 link currently points to /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
请注意,默认情况下没有定义任何环境变量JAVA_HOME,您需要在需要它的用户的.bashrc中自己定义它。
在先前的示例中,JAVA_HOME的正确值将是/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64
有关详细信息,请参见安装OpenJDK文档,搜索"可选:设置JAVA_HOME环境变量"部分。

12

readlink 命令会显示符号链接的完整路径:

readlink -f `which java`

11

首先,从命令行尝试运行echo $JAVA_HOME,因为java已经在您的路径中了,所以可能已经设置了JAVA_HOME

找出我的Java安装目录的最佳方法是什么?

运行命令which java将指向java安装的位置。

然后设置JAVA_HOME

您可以编辑~/.bashrc~/.bash_profile/etc/profile来设置JAVA_HOME。在~/etc/profile中设置它会使其在系统范围内生效,这可能不是您想要的。例如,假设which java的输出为/opt/jdk_1.7.0_25,那么只需将export JAVA_HOME=/opt/jdk_1.7.0_25添加到~/.bashrc~/.bash_profile中,然后运行source ~/.bashrc(如果您将其设置在此处,则运行source ~/.bash_profile)。

请注意,在这种情况下,javaPATH中,但在某些情况下,您需要添加export PATH=$PATH:$JAVA_HOME/bin以将JAVA_HOME变量添加到PATH中。


Java给了我:/usr/bin/java。然而,当我尝试浏览到这个文件夹时,它并不存在。我可以找到/usr/bin,但里面没有java。 - Rohit Pandey
通常,/usr/bin/java 是指向文件系统中其他位置的 java 二进制文件的符号链接。如果在 /usr/bin 中运行 ls -l 命令,则不会看到 java 实用程序。 - rpmartz
好的,我设置了 - export JAVA_HOME=/usr 并且我尝试运行的程序(pig)可以工作了(它在脚本中添加了/bin/java)。现在它已经可以正常工作,但是将其设置为 /usr 看起来不太对劲.. 如果这样做有危险或任何其他事情,请告诉我。 - Rohit Pandey
1
很高兴听到你已经把它弄好了。我建议打开终端并输入cd /usr/bin,随后运行ls -l | grep java,这将显示/usr/bin/java指向的位置。您需要将其设置为JAVA_HOME。我认为你所做的不会造成危险,但对于那些使用JAVA_HOME来查找其他内容的东西(例如javac),可能会在/usr/bin中有链接的问题。 - rpmartz
5
你可以通过运行 readlink -f $(which java) 来找到 Java 二进制文件的位置。这对于基于 Java(在路径中)创建 JAVA_HOME 环境变量非常有效: export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))。 致谢:如何在 Linux 上自动设置 JAVA_HOME 环境变量 - mgarde

6

最好的做法是完全避免使用Red Hat的java。

从Oracle获取您的java,并将其放入/opt中。 然后只需创建符号链接/opt/java -> /opt/jdk-someversion,并创建/etc/profile.d/java.sh,其中包含:

#!/bin/sh
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH

然后,要更改系统范围的Java,只需更改opt中的符号链接。要使用多个Java版本,请使用上述脚本并使用适当的JAVA_HOME。

此外,用于运行/etc/init.d脚本的/sbin/service脚本将剥离环境变量-显式执行env -i。因此,例如您的Tomcat将无法获取JAVA_HOME,您必须在$CATALINA_BASE/bin中创建setenv.sh。

这种方法的缺点是您无法从Red Hat获取Java更新。


3

我找到了一种方法将上述内容结合起来,以便可以编程设置JAVA_HOME

export JAVA_HOME=$(dirname $(readlink -f $(which java))|sed 's^jre/bin^^')

在Ubuntu上,返回 /usr/lib/jvm/java-8-openjdk-amd64/。在CentOS7上,返回 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64/。可以使用以下命令将其添加到Makefile中。
JAVA_HOME = $(shell dirname $$(readlink -f $$(which java))|sed 's^jre/bin^^')

这比导出硬编码的路径更安全,且更具可移植性。


3
至少在RHEL 7上,alternatives会在以下位置设置java_sdk的从链接:

/etc/alternatives/java_sdk/

这是指向SDK安装根目录的符号链接。


2

对于我来说,在/etc/alternatives中更改链接是有效的,具体步骤如下:

java -> /app/java/jdk8u222-b10/jre/bin/java

我知道这是旧的Java代码,但在我们公司这个服务器一直被忽视。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接