【问题标题】:How to set JAVA_HOME in Linux for all users如何在 Linux 中为所有用户设置 JAVA_HOME
【发布时间】:2014-08-29 18:17:21
【问题描述】:

我是 Linux 系统的新手,Java 文件夹似乎太多了。

java -version 给我:

  • java版本“1.7.0_55”
  • OpenJDK 运行时环境 (rhel-2.4.7.1.el6_5-x86_64 u55-b13)
  • OpenJDK 64 位服务器 VM(内部版本 24.51-b03,混合模式)

当我尝试构建 Maven 项目时,出现错误:

Error: JAVA_HOME is not defined correctly.
We cannot execute /usr/java/jdk1.7.0_05/bin/java

您能否告诉我需要为 root 和非 root 用户修改哪些文件以及 java 的确切位置?

【问题讨论】:

    标签: java linux java-home path-variables


    【解决方案1】:
    1. 打开终端并输入sudo gedit .bashrc

    2. 它会询问您的密码。输入密码后,它将打开 bash 文件。然后转到结尾并输入:

      export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"
      export PATH=$PATH:$JAVA_HOME/bin
      
    3. 然后保存文件并退出文件

    以上是针对单个用户的。对于所有用户,您必须按照以下步骤操作

    1. gedit /etc/profile

    2. export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"

    3. export PATH=$PATH:$JAVA_HOME/bin

    【讨论】:

    • 这个答案只为当前用户设置。
    • 这里有一个错字。如果 java home 有一个尾随 /,那么当你设置 PATH 时,你将有两个 //
    【解决方案2】:

    对于新用户来说使用 vim 可能有点困难。我们可以改用 gedit 文本编辑器。

    1. 找到 /usr/lib/jvm/java-1.x.x-openjdk

    2. 如果以非特权身份登录,请输入“gedit /etc/profile”或使用“sudo gedit /etc/profile”

    3. 在行尾添加以下内容:

      export JAVA_HOME="你找到的路径"

      导出 PATH=$JAVA_HOME/bin:$PATH

    4. 在您当前的 shell 中输入“source /etc/profile”以应用更改

    【讨论】:

      【解决方案3】:

      首先,您需要了解您的 PC 中安装了哪些 Java 以及要使用哪一个。 对于具有 root 权限的打开终端。

       sudo su
      
       ls /usr/lib/jvm/
      

      现在它将列出可用的 java 版本。 选择列出的版本。

      复制路径直到那里。

      现在打开 bashrc

        nano ~/.bashrc
      

      将以下命令添加到末尾

       export JAVA_HOME="path that you copied"
      
        export PATH=$JAVA_HOME/bin:$PATH
      

      然后保存文件并按 Ctrl+S 然后按 Ctrl+X 退出

      现在运行以下命令:

        source ~/.bashrc
      

      【讨论】:

        【解决方案4】:

        对于所有用户,我建议在/etc/profile.d/java_home.sh 中创建一个文件

        # Set JDK installation directory according to selected Java compiler
        
        export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
        

        这将动态更新并与 alternatives 系统配合使用。请注意,更新只会在新的登录 shell 中进行。

        【讨论】:

        • 为了遵守简单的 JRE(甚至是无头),请改用 export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/bin/java::") - 请注意我只使用 java,而不是 javac
        • @oculta 至少Maven 期望 JAVA_HOME 指向一个 JDK 并使用它来定位 java 编译器。
        • 支持readlink 和更新/升级兼容的解决方案,即使这是一个已有 5 年历史的线程。我只建议不要编辑 /etc/profile,而是将您的导出文件放在自定义文件中,例如/etc/profile.d/java_environment.sh,也许你必须chmod +x java_environment.sh 并重新启动。
        • 完美。比我笨拙的dirname-ing 解决方案要好。如果您像我一样想了解这里发生了什么,这是一个简单的用空字符串替换输入中的匹配文本。替换的“默认”字符是/,但只要你保持一致,你可以用任何东西替换/。在这种情况下,它是冒号,因为我们使用 / 作为路径分隔符。
        【解决方案5】:

        在 /etc/profile 中,如果您打开它,您会知道不建议在该文件上写入。而不是让你的命令脚本(假设 test.sh)转到 /etc/profile.d 文件夹并将 test.sh 放在那里。每次实例重启时,它都会被 /etc/profile 自动调用。

        【讨论】:

          【解决方案6】:

          所有操作步骤(查找java,父目录,编辑文件,...)一个解决方案

          zFileProfile="/etc/profile"
          zJavaHomePath=$(readlink -ze $(which java) | xargs -0 dirname | xargs -0 dirname)
          echo $zJavaHomePath
          
          echo "export JAVA_HOME=\"${zJavaHomePath}\"" >> $zFileProfile
          echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> $zFileProfile
          

          结果:

          # tail -2 $zFileProfile
          export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64"
          export PATH=$PATH:$JAVA_HOME/bin
          

          解释:

          1) 让我们把完整的命令分解成小块

          $(readlink -ze $(which java) | xargs -0 dirname | xargs -0 dirname)
          

          2) 从java命令中查找java路径

          # $(which java)
          "/usr/bin/java"
          

          3) 从符号路径获取相对路径

          # readlink -ze /usr/bin/java
          "/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin/java"
          

          4) 获取/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin/java的父路径

          # readlink -ze /usr/bin/java | xargs -0 dirname
          "/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin"
          

          5) 获取/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin/的父路径

          # readlink -ze /usr/bin/java | xargs -0 dirname | xargs -0 dirname
          "/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64"
          

          【讨论】:

            【解决方案7】:

            用sudo打开kafka-run-class.sh来写

            您可以在您的 kafka 文件夹中找到 kafka-run-class.shkafka/bin/kafka-run-class.sh

            检查这些行

            修改 else 部分中的 JAVA 变量以指向您的 java/bin 中的 java 可执行文件。像 JAVA="$JAVA_HOME/java"

            【讨论】:

              【解决方案8】:

              使用 SDKMAN sdkman.io 来切换 btw。你的sdk。

              它会为你设置 JAVA_HOME。

              【讨论】:

                【解决方案9】:

                1...使用快捷方式Ctlr + Alt + T 打开终端

                2...执行以下命令:

                echo export JAVA_HOME='$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")' | sudo tee /etc/profile.d/jdk_home.sh > /dev/null
                

                3...(推荐)重新启动您的虚拟机/计算机。如果不想重启电脑,可以使用source /etc/source

                4...使用快捷方式Ctlr + Alt + T 打开终端

                5...用

                验证 JAVA_HOME 安装
                echo $JAVA_HOME
                

                flob 的单行副本,感谢他们

                【讨论】:

                  【解决方案10】:

                  复制你安装的bin文件路径

                  YOUR PATH
                  

                  通过输入以下命令打开终端并编辑环境文件,

                  sudo nano /etc/environment
                  

                  在此文件中,添加以下行(将 YOUR_PATH 替换为刚刚复制的路径):

                  JAVA_HOME="YOUR_PATH"
                  

                  设置环境变量应该足够了。现在重新加载这个文件:

                  source /etc/environment
                  

                  现在通过执行来测试它:

                  echo $JAVA_HOME
                  

                  【讨论】:

                  • olny 影响当前终端会话
                  • @FatihTürker 重启你的电脑
                  • 对于使用 jdk11 的我来说,YOUR_PATH 是 /usr/lib/jvm/default-java/
                  • 已设置 JAVA_HOME 路径但它不起作用。即java不工作。即使重启后
                  【解决方案11】:

                  第 1 步 - 通过“echo $JAVA_HOME”检查当前的 java 版本

                  第 2 步 - vim /etc/profile

                  第 3 步 - 在文件末尾,您会发现 export JAVA_HOME,这里我们需要提供新的路径,确保不是相对的。

                  第 4 步 - 保存并退出 :wq

                  第 5 步 - “source /etc/profile/”,这将执行更改

                  第 6 步 - 再次执行 echo $JAVA_HOME - 更改将被反映。

                  【讨论】:

                    【解决方案12】:
                    1. find /usr/lib/jvm/java-1.x.x-openjdk
                    2. vim /etc/profile

                      如果以非特权用户身份登录,请添加 sudo,即。 sudo vim

                    3. 按“i”进入插入模式
                    4. 添加:

                      export JAVA_HOME="path that you found"
                      
                      export PATH=$JAVA_HOME/bin:$PATH
                      
                    5. 注销并再次登录,重新启动,或使用source /etc/profile 立即在当前 shell 中应用更改

                    【讨论】:

                    • 不要忘记删除双引号并从键盘重新创建它们,因为只有复制和粘贴可能会产生麻烦。
                    • @rbaleksandar 一些应用程序依赖于JAVA_HOME,设置它也无妨。
                    • IntelliJ 就是这样一个应用程序 - 而不是一个次要的应用程序。
                    • 您需要运行 source /etc/profile 才能使更改立即生效!
                    • 我认为可以安全地提及如何通过按“Esc”进入命令模式,然后输入“:w”并按“Enter”来保存所做的更新。
                    【解决方案13】:

                    作为答案发布,因为我无权发表评论。

                    注意事项:按照“那个戴夫家伙”发布的公认答案。

                    设置变量后,请确保为安装它的 java 目录设置了适当的权限。

                    chmod -R 755 /usr/java
                    

                    【讨论】:

                      【解决方案14】:

                      给出的答案是以前的帖子是有效的。但没有一个答案是完整的:

                      1. 不推荐更改 /etc/profile,因为原因(如 /etc/profile 中所述):
                      • 除非您知道自己在做什么,否则更改此文件不是一个好主意。最好在其中创建一个 custom.sh shell 脚本 /etc/profile.d/ 对您的环境进行自定义更改,因为这样 将避免在未来的更新中进行合并。*
                      1. 如上所述,为自定义更改创建 /etc/profile.d/custom.sh 文件。

                      2. 现在,要始终与安装的较新版本的 Java 保持同步,切勿放置绝对路径,而是使用:

                      #if 将 jdk 设为 java home

                      导出 JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")

                      #if 将 jre 设为 java home

                      导出 JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/bin/java::")

                      1. 记得有#! /bin/bash 在 custom.sh 文件中

                      【讨论】:

                        【解决方案15】:

                        您可以使用 /etc/profile 或更好的文件,例如 /etc/profile.d/jdk_home.sh

                        export JAVA_HOME=/usr/java/jdk1.7.0_05/
                        

                        你必须记住,这个文件只加载了新的登录 shell。所以在 bash -l 或新的 gnome-session 之后,它不会随着新的 Java 版本而改变。

                        【讨论】:

                        • 至少在我的 linux (raspbian) 中,/etc/profile 将获取 /etc/profile.d/*.sh,因此您的文件需要被称为 jdk_home.sh,以便获取源
                        • 谢谢@Hilikus :-) 我相应地改变了它。
                        • 谢谢。为了两全其美,我将您和@Eero 的答案混合在一起;)
                        • /etc/profile.d/jdk_home.sh 是更清晰的答案,至少对于 Ubuntu 来说,/etc/profile 已经包含了很多逻辑。添加更多内容似乎并不明智......
                        【解决方案16】:

                        这是解决问题的一个非常简单的脚本

                        export JAVA_HOME_BIN=`which java`
                        export JAVA_HOME_DIR=`dirname $JAVA_HOME_BIN`
                        export JAVA_HOME=`dirname $JAVA_HOME_DIR`
                        

                        对于测试:

                        echo $JAVA_HOME
                        

                        【讨论】:

                          【解决方案17】:

                          虽然我们要设置 JAVA_HOME,但让我分享一些设置 JAVA_HOME 或任何其他环境变量的好处:

                          1) 升级 JDK 很容易,不会影响您的应用程序启动和指向 JAVA_HOME 的配置文件。您只需要下载新版本并确保您的 JAVA_HOME 指向新版本的 Java。这是使用环境变量或链接的最大好处。

                          2) JAVA_HOME 变量短而简洁,而不是 JDK 安装目录的完整路径。

                          3) JAVA_HOME 变量是平台无关的,即如果你的启动脚本使用 JAVA_HOME,那么它可以在 Windows 和 UNIX 上运行而无需任何修改,你只需要在各自的操作系统上设置 JAVA_HOME。

                          阅读更多:http://javarevisited.blogspot.com/2012/02/how-to-set-javahome-environment-in.html#ixzz4BWmaYIjH

                          【讨论】:

                            【解决方案18】:

                            在 RHEL 7 中没有其他答案对我来说是“坚持”的,即使直接在 /etc/profile~/.bash_profile 中设置 JAVA_HOMEPATH 也不起作用。每次我尝试检查是否设置了 JAVA_HOME 时,它都会出现空白:

                            $ echo $JAVA_HOME
                                (<-- no output)
                            

                            我要做的是在/etc/profile.d/jdk_home.sh 中设置一个脚本

                            #!/bin/sh
                            export JAVA_HOME=/opt/ibm/java-x86_64-60/
                            export PATH=$JAVA_HOME/bin:$PATH
                            

                            我最初忽略了第一行(#!/bin/sh),没有它就无法工作。

                            现在它正在工作:

                            $ echo $JAVA_HOME
                            /opt/ibm/java-x86_64-60/
                            

                            【讨论】:

                            • 我在 RHEL 7 上也有同样的经历。我从 ~/.bash_profile 中删除了导出并使用了这种方法。
                            • #!/bin/sh 在您的 jdk_home.sh 中不是必需的。完成配置后,请确保注销并再次登录
                            【解决方案19】:

                            在 Linux 上,我将此行添加到我的 ~/.profile:

                            export JAVA_HOME=$(readlink -ze /usr/bin/javac | xargs -0 dirname -z | xargs -0 dirname)
                            

                            【讨论】:

                            • 这似乎是一个可能正确的答案,但你能解释一下它的为什么它起作用,即它的作用和OP的问题是什么?另外,您说的是“在 Linux 上”,但有许多不同的 Linux 发行版,它可能并不适用于所有发行版,请添加适用于哪个发行版。
                            【解决方案20】:

                            我用线:

                            export JAVA_HOME=$(readlink -f $(dirname $(readlink -f $(which java) ))/../)
                            

                            到我的 ~/.profile 所以它在登录时使用默认 java 目录的基础。这是为 bash 准备的。

                            【讨论】:

                              【解决方案21】:

                              获取您编辑的任何个人资料可能是一个好主意,以省去使用新登录的麻烦。

                              要么: 来源 /etc/ 要么 . /etc/

                              您编辑的个人资料在哪里。

                              【讨论】:

                                【解决方案22】:

                                做 Oracle 做的事情(作为一名前 Sun 员工,我无法习惯那种做法)

                                ln -s latestJavaRelease /usr/java/default
                                其中 latestJavaRelease 是您要使用的版本

                                然后导出 JAVA_HOME=/usr/java/default

                                【讨论】:

                                  猜你喜欢
                                  • 2023-03-17
                                  • 2018-03-31
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2014-08-11
                                  • 2020-01-11
                                  • 2014-12-08
                                  相关资源
                                  最近更新 更多