在Ubuntu中轻松更改$JAVA_HOME

138
在Ubuntu中,我想在Java 5和6之间切换JAVA_HOME环境变量。我打开终端并输入以下内容来设置JAVA_HOME环境变量:
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

然后在同一个终端窗口中,我输入以下内容来检查环境变量是否已更新:

echo $JAVA_HOME

我看到了 /usr/lib/jvm/java-1.5.0-sun ,这正是我所期望的。此外,我修改了~/.profile并将JAVA_HOME环境变量设置为/usr/lib/jvm/java-1.5.0-sun。

现在出现问题了——当我打开新的终端窗口并使用echo $JAVA_HOME 检查我的JAVA_HOME环境变量时,我发现我的JAVA_HOME环境变量已经恢复成Java 6了。当我重新启动计算机(或注销并重新登录)时,JAVA_HOME环境变量被设置为Java 5(可能是因为我在~/.profile中做的修改)。

有没有办法解决这个问题,以便我可以更改我的JAVA_HOME环境而无需注销并重新登录(并且使该环境变量更改在所有新的终端窗口中保持不变)?


29
什么是正确的网站和重复的答案? - Martin Konicek
~/.profile 文件仅在登录 Ubuntu 时读取,因此如果您注销/登录,则 JAVA_HOME 将为所有终端和运行的任何其他应用程序设置。如果您在 ~/.bashrc 中设置了 JAVA_HOME,则只有从终端运行的应用程序才能看到它。 - practicalli-john
8个回答

197

将环境变量放入全局的/etc/environment文件中:

...
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
...

在您想要更新变量的每个 shell 中执行 "source /etc/environment":

$ source /etc/environment

检查它是否正常工作:

$ echo $JAVA_HOME
$ /usr/lib/jvm/java-1.5.0-sun

太好了,不需要注销。

如果您想在终端中设置JAVA_HOME环境变量,只需在~/.bashrc文件中设置。


10
这些更改需要重新启动后才能影响通过Ubuntu用户界面启动的应用程序(即双击应用程序)。 - Eric Hu
7
这与每次在每个烦人的 shell 中设置变量有何不同? - mlissner
1
另一种不必每次手动运行的方法是修改您的 .bashrc 文件,将命令“source /etc/environment”包含在其中。 - nityan
1
@MartinKonicek,你的例子是不正确的。那一行不应该有“export”。/etc/environment 包含键值对。 - pdeva
1
请注意,/etc/environment 是特殊的,不允许变量替换,例如 JRE_HOME=${JAVA_HOME}/jre 将无法工作。 - Abdull
显示剩余6条评论

31

这可能会解决您的问题:

https://help.ubuntu.com/community/EnvironmentVariables

会话级别的环境变量

若要设置影响特定用户环境的环境变量,不应将设置其值的命令放置在用户主目录中的特定 shell 脚本文件中,而是使用:

~/.pam_environment - 此文件专门用于设置用户环境。它不是脚本文件,而是由一个赋值表达式组成,每行一个。

不推荐使用:

~/.profile - 这可能是最好的文件,用于在其中放置环境变量分配,因为在启动过程桌面会话期间 DisplayManager 自动执行它,并且在从文本控制台登录时由登录 shell 执行。


从您提供的链接中:以下内容不建议使用,但此页面提供的先前解决方案在10.04桌面版本中无法正常工作。 .pam_environment在发行版中不会被自然处理。 - Calmarius
14
~/.pam_environment 是一个很棒的方式,可以在假设它处理变量时破坏您的登录。我尝试将 PATH 设置为 ${PATH}:${HOME}/bin,但它未能评估这些变量。最终结果是:无法登录 :( 通过访问 Ctrl-Alt-1 并运行 "/bin/rm ~/.pam_environment" 来修复。请特别小心或使用辅助账户测试此处的设置。 - Alain O'Dea
6
就我个人而言,我不知道为什么他们要创建环境文件,然后使其以与设置环境变量的任何其他机制完全不同的方式工作。像环境文件使用的简单键值对就是纯属胡扯。我们在环境中使用变量和链接的原因仍然有价值。它简化了管理。决定在此文件中采用PAM方式进行操作的蠢货最多只能被视为智商低下。变量需要被解释。 - Bill Rosmus
1
@AlainO'Dea:我也遇到了完全相同的问题。当我无法通过登录屏幕时,感到震惊和担忧。经过一番搜索,我发现您可以使用变量,但必须使用不同的语法。例如,PATH DEFAULT=${PATH}:${HOME}/bin 当它不使用变量时,简单的赋值似乎有效。 - tim_wonil
是的,我同意@AlainO'Dea的观点。如果您的脚本中有任何错误,您将无法登录。请小心。 - Evan Hu

13

请尝试以下步骤。

--我们将编辑“etc\profile”文件。 环境变量将被输入到该文件的底部。由于Ubuntu不允许访问root文件夹,我们需要在终端中使用一些命令。

步骤1:打开终端。输入指令:gksudo gedit /etc/profile

步骤2:打开"profile"文本文件。在页面底部输入环境变量.........例如:export JAVA_HOME=/home/alex/jdk1.6.0_22/bin/java

export PATH=/home/alex/jdk1.6.0_22/bin:$PATH

步骤3:保存并关闭文件。使用echo命令检查环境变量是否已设置........ 例如: echo $PATH


9

您需要将变量定义放在~/.bashrc文件中。

从bash手册页中得知:

当启动一个非登录的交互式shell时,bash会读取并执行/etc/bash.bashrc和~/.bashrc文件(如果这些文件存在)。


5
传统上,如果您只想在终端窗口中更改变量,则应将其设置在 .bashrc 文件中,该文件每次打开新终端时都会被引用。相比之下,.profile 文件并不是每次打开新终端时都会被引用。
可以查看这个问题中 .profile.bashrc 的区别:What's the difference between .bashrc, .bash_profile, and .environment? .bashrc 可以解决您的问题。然而,在使用 Ubuntu 时,这并不是正确的解决方案。请参考有关 Ubuntu 的相关帮助页面 "Session-wide environment variables"。因此,难怪 .profile 对您没有作用。我使用的是 Ubuntu 12.04 和 xfce。我设置了我的 .profile,但即使我退出并重新登录,它也根本没有生效。类似的经历可以在 这里 找到。所以您可能需要使用 .pam_environment 文件,完全忘记 .profile.bashrc。请注意,.pam_environment 不是脚本文件。

1

在修改了.profile文件后,您需要执行该文件,以使更改生效。

root@masternode# . ~/.profile

一旦完成此操作,echo命令将会生效。

你应该使用~/.profile而不是./.profile - Alexis Wilke

1

请看 bash(1) ,你需要一个 登录 shell 才能读取 ~/.profile,即使用 -l 选项。


1

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