如何为Java设置JAVA_HOME?

我已经安装了一个Java版本。我们如何正确设置$JAVA_HOME环境变量?
4个回答

您可以按照Petronilla Escarabajo的建议,在/etc/profile中设置您的JAVA_HOME。但是/etc/environment是首选的JAVA_HOME或任何系统变量的位置。
在任何文本编辑器(如nanogedit)中打开/etc/environment并添加以下行:
JAVA_HOME="/usr/lib/jvm/open-jdk"

(java路径可能不同)

使用source命令加载变量,运行以下命令:

source /etc/environment

然后通过运行以下命令来检查变量:
echo $JAVA_HOME

更新

通常大多数Linux系统默认会引用/etc/environment文件。如果您的系统没有这样做,请将以下行添加到~/.bashrc文件中(感谢@pje)。

source /etc/environment

2当我尝试运行Android Studio(它以IntelliJ IDEA为基础)时,我遇到了一个非常类似于@advocate的错误信息:“'tools.jar'似乎不在Android Studio的类路径中。” 在没有成功地调整JAVA_HOME的情况下,我决定查看启动Android Studio的shell脚本studio.sh。作为一个猜测,我将JDK_HOME设置为与JAVA_HOME期望的相同值,然后问题迎刃而解。 - Hilton Fernandes
如何为不同的JDK设置多个路径?http://paste.ubuntu.com/13151297/ 这个链接可以吗? - LOG_TAG
这个设置似乎是临时的。在重新启动电脑后,我们需要再次找到它。 - Samitha Chathuranga
6对于进行软件开发的人来说,除非你每次切换JDK版本都想重新启动,否则不要将JAVA_HOME放在/etc/environment中。 - Dave
3这只是一个临时解决方案,正如其他人指出的那样。没有人会希望在每次重新启动bash时都运行源代码。 - yuranos
7正如其他人所指出的那样,这个方法在终端会话之间并不生效。为了解决这个问题,我只是在我的bash配置文件~/.bashrc的顶部添加了一行代码source /etc/environment,这样它就可以在启动时加载所有的环境设置了。目前对我来说还有效。 - pje
@ManulaWaidyanatha pje的评论应该包含在你的回答中。每次打开新终端都执行"source /etc/environment"是不实际的。 - Pedro Gordo
2@sedulam 我更新了答案。 - Manula Waidyanatha
如果不是在/etc/environment中,那么你应该在哪里进行JAVA_HOME的赋值呢? - Robert Oschler
1@RobertOschler @HDave 你不需要每次都重新启动服务器。你可以使用source命令重新加载配置。 - Manula Waidyanatha
在Ubuntu 18.04中,当我执行"echo $JAVA_HOME"时,我可以看到已设置的变量,但它在"printenv"的输出中没有列出来 - 为什么呢? - Oleg Vazhnev
1在我的情况下(19.04),无法使用“Sourcing /etc/environment”命令。请参考https://superuser.com/questions/339617/how-to-reload-etc-environment-without-rebooting - Azmisov
ls: cannot access '/usr/lib/jvm/open-jdk': No such file or directory - Damien
如今(23.10),如果你通过apt安装了default-jdkdefault-jre,你应该能在JAVA_HOME="/usr/lib/jvm/default-java"找到它。这是一个符号链接,指向同一文件夹中的当前版本。如果你总是想使用最新安装的版本,这是最佳选择。 - undefined

设置JAVA_HOME环境变量,请按以下步骤操作:
1. 按下键盘上的Ctrl+Alt+T来启动终端。 2. 输入以下命令:
$ gksudo gedit /etc/environment 3. 根据您安装Java的位置,您需要提供完整路径。以此示例为例,我将Oracle JDK 7安装在/usr/lib/jvm/java-7-oracle目录中。
滚动到文件末尾,并输入以下内容:
JAVA_HOME=/usr/lib/jvm/java-7-oracle
export JAVA_HOME 4. 保存文件并退出gedit。 5. 最后,使用以下命令重新加载系统路径:
$ . /etc/environment 以上方法将避免您每次登录计算机时都要运行这些命令的麻烦。

7如何工作的 /etc/environment? - Sudip Bhandari
1/etc/environment中是否需要添加export命令? - pkaramol
@pkaramol 我不得不在16.04LTS上添加了导出JAVA_HOME,以便在启动时加载。 - adeen-s
4@adeen-s 你在/etc/environment文件的一行中添加了export,这有帮助吗?该文件包含解析为以=分隔的名称-值对的变量定义;其内容不会作为命令执行。(请参见man pam_env)。因此,除非你将该文件单独处理为脚本(例如通过将/etc/environment传递给bash的./source内置命令),否则我不会指望它起作用。 - Eliah Kagan
1/etc/environment 是如何工作的? -- .(点)从文件中加载命令 https://askubuntu.com/a/232938/189965 - Roman Bekkiev
我对这个问题持怀疑态度,不确定这是否会在所有未来的会话中保留JAVA_HOME路径?我按照上述步骤进行了操作。但是在我注销并重新登录后,echo $JAVA_HOME没有显示Java安装路径。有什么原因吗? - raikumardipak

如果你不知道路径,只安装了openJDK,你可以输入update-alternatives --config java来查找路径。要设置变量,你可以写JAVA_HOME=<PATH>,然后跟着export JAVA_HOME。注意,在声明变量时不要有空格。要检查变量是否存储,只需输入echo $JAVA_HOME进行验证。

1这似乎是静态的。如果我移除 openjdk-7 并安装 openjdk-9,那么 JAVA_HOME 不就会指向错误的位置了吗?如何使其变得动态? - DavidJ
3通过您手动更改它。再次强调,您是使其变得动态的方式... - Dave
@HDave 的意思是,在某些情况下,您可能希望 JAVA_HOME 指向特定的 Java 版本,因此使 JAVA_HOME 的更新动态化可能不是您想要的。 - Maciej
我喜欢这个答案。我用echo测试并查看了我的路径。然而,我很困惑为什么在运行mvn -version时仍然收到“JAVA_HOME”环境变量未设置的错误提示。 - Winnemucca
3我在更无知的时候写了这个答案。按照描述设置变量只会影响当前的终端会话,并不会被持久化。正确的方法是运行以下命令:update-alternatives --install <link> <name> <target> <priority>例如: update-alternatives --install /usr/bin/java java /usr/lib/jvm/default-runtime/bin/java 1 - Erro

这是最佳选择,如果你总是想使用最新安装的版本。
现在(Ubuntu 23.10),你应该通过apt来安装它。
sudo apt install default-jdk # or default-jre

在这种情况下,你应该在/usr/lib/jvm/default-java找到它。 这是一个符号链接,指向同一文件夹中当前JVM的位置。 所以,只需运行以下命令将环境添加为一个单独的文件:
sudo nano /etc/environment.d/90java.conf

添加这行并保存:
JAVA_HOME="/usr/lib/jvm/default-java"

然后重新启动或重新登录,或者在当前shell中使用source /etc/environment.d/90java.conf来加载它。