【问题标题】:What is the correct target for the JAVA_HOME environment variable for a Linux OpenJDK Debian-based distribution?基于 Linux OpenJDK Debian 的发行版的 JAVA_HOME 环境变量的正确目标是什么?
【发布时间】:2010-10-14 09:37:44
【问题描述】:

在 Windows 中,JAVA_HOME 必须指向 JDK 安装文件夹(以便 JAVA_HOME/bin 包含所有可执行文件,JAVA_HOME/libs 包含所有默认的 jar 库)。

如果我下载 Sun 的 JDK 包并将其安装在 Linux 中,则过程相同。

但是,我需要使用 Kubuntu 的默认 OpenJDK 包。问题是所有可执行文件都放在/usr/bin 中。但是罐子放在/usr/share/java。由于它们不在同一个 JAVA_HOME 文件夹下,因此我在使用 Grails 时遇到了问题,并且可能会遇到其他需要标准 Java 结构的应用程序的问题。

  1. 如果我使用:

    JAVA_HOME=/usr
    

    想要使用任何 Java 可执行文件的所有应用程序和脚本都可以使用标准过程 call $JAVA_HOME/bin/executable。但是,由于罐子位于不同的位置,因此并不总是能找到它们(例如:在 grails 中,native2asciiClassDefNotFound)。

  2. 另一方面,如果我使用:

    JAVA_HOME=/usr/share/java
    

    找不到任何 Java 可执行文件(javajavac 等)。

那么,在基于 Debian 的 Linux 中处理 JAVA_HOME 变量的正确方法是什么?

感谢您的帮助, 路易斯

【问题讨论】:

    标签: java grails java-home debian-based


    【解决方案1】:

    最终对我有用(Grails 现在运行顺利)几乎就像 Steve B. 指出的那样:

    JAVA_HOME=/usr/lib/jvm/default-java
    

    这样,如果用户更改了系统的默认 JDK,JAVA_HOME 仍然有效。

    default-java 是指向当前 JVM 的符号链接。

    【讨论】:

    • Debian 7 上好像没有这个链接
    • 在 RHEL5.10 上是 /usr/lib/jvm/java
    • 我用过 /usr/lib/jvm/java-7-openjdk-amd64
    • 对于 Oracle Linux 7(这应该适用于 CentOS 和 RHEL),我创建了一个名为 /etc/profile.d/java.sh 的文件并用以下内容填充它: JAVA_HOME=/usr/lib/jvm/jre-openjdk export JAVA_HOME 在重新采购 /etc/profile 后(通过运行 source /etc/profile) JAVA_HOME 已按预期填充。
    【解决方案2】:

    如果您使用替代方法来管理多个 java 版本,您可以根据符号链接的 java(或 javac)设置 JAVA_HOME,如下所示:

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

    【讨论】:

    • 这对我有用:JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/jre/bin/java::")
    • 出色的解决方案,解决了我多年来对 JAVA_HOME 的困扰,它往往指向不同操作系统上的不同位置。
    • 请注意,这个聪明的解决方案不适用于像 Gentoo 这样的发行版,其 /usr/bin/java 指向脚本 (/usr/libexec/eselect-java/run-java-tool.bash)。不过,这是一个不错的方法。我唯一要改变的是使用 Bash 的内置替换来避免产生 sed,例如:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
    • 这很好 :) 可能想要将 javac 更改为 java,因为不是每个人都安装了 JDK;只有 JRE
    • @AlexisWilke 现在用 java 代替 javac
    【解决方案3】:

    标准的 Ubuntu 安装似乎将各种 Java 版本放在 /usr/lib/jvm 中。您在路径中找到的javac, java 将软链接到此。

    只要您设置JAVA_HOME 环境变量并确保在您的路径上有新的Java bin,就可以在您喜欢的任何地方安装您自己的Java 版本。

    一个简单的方法是让 Java 主目录作为软链接存在,这样如果你想升级或切换版本,你只需要更改它指向的目录 - 例如:

    /usr/bin/java --> /opt/jdk/bin/java,
    
    /opt/jdk --> /opt/jdk1.6.011
    

    【讨论】:

    • 向 Debian 推荐 Ubuntu 解决方案是很危险的。它们可以而且确实会有所不同。
    • 请注意请求者说他使用的是 Kubuntu,所以 Ubuntu 解决方案应该没问题。
    【解决方案4】:

    我修改了上述解决方案之一,无论 java 安装在哪里,只要它在您的 PATH 中,这似乎都有效。

    JAVA_HOME=$( j=$( readlink -f $(which java) ) ; echo ${j%%/bin/java} )
    

    【讨论】:

    【解决方案5】:

    我通常没有任何 JAVA_HOME 环境变量。 Java 可以自行设置。里面的 java java.home 系统属性应该是可用的。

    【讨论】:

    • 我通常也没有。但是,如果我不设置它,grails 会抱怨 JAVA_HOME 不存在并中止。
    • ant 在 debian 中也需要它
    【解决方案6】:

    也尝试设置 JAVA_LIB 变量。

    【讨论】:

      【解决方案7】:

      如果您遇到找不到 JAR 文件的问题,我还会确保您的 CLASSPATH 设置为包含这些文件的位置。但是我确实发现 CLASSPATH 通常需要针对不同的程序进行不同的设置,并且通常最终会成为为各个程序唯一设置的东西。

      【讨论】:

        【解决方案8】:

        可以在此处找到将解决您的问题的更新答案以及在 Ubuntu 上安装 Oracle Java 7 的一般好方法:http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

        【讨论】:

          【解决方案9】:

          我发现 Ubuntu 中的 openjdk-6-jre 和 openjdk-6-jre-headless 软件包存在类似问题。

          通过清除 openjdk-6-jre 和 openjdk-6-jre-headless 软件包并重新安装,我的问题得到了解决。替代方案仅在全新安装 openjdk-6-jre 和 openjdk-6-jre-headless 软件包时更新。

          以下是清除后安装示例:

          aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
          aptitude install --without-recommends openjdk-6-jre # Installing without some extras
          Reading package lists... Done
          Building dependency tree
          Reading state information... Done
          Reading extended state information
          Initializing package states... Done
          The following NEW packages will be installed:
            ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
            openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
          The following packages are RECOMMENDED but will NOT be installed:
            icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
          0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
          Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
          Do you want to continue? [Y/n/?]
          Writing extended state information... Done
          Selecting previously deselected package openjdk-6-jre-lib.
          (Reading database ... 62267 files and directories currently installed.)
          Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
          ...
          Processing triggers for man-db ...
          Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
          ...
          Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
          Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
          update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
          ...
          

          您可以在上面看到 update-alternatives 运行以设置各种 Java 二进制文件的链接。

          安装后,/usr/bin 中还有链接,/etc/alternatives 中的链接,/var/lib/dpkg/alternatives 中每个二进制文件的文件。

          ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
          lrwxrwxrwx 1 root root  40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
          lrwxrwxrwx 1 root root  22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
          -rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java
          

          让我们将其与不清除的安装进行对比。

          aptitude remove openjdk-6-jre
          aptitude install --without-recommends openjdk-6-jre
          Reading package lists... Done
          Building dependency tree
          Reading state information... Done
          Reading extended state information
          Initializing package states... Done
          The following NEW packages will be installed:
            ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
            openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
          The following packages are RECOMMENDED but will NOT be installed:
            icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
          0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
          Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
          Do you want to continue? [Y/n/?]
          Writing extended state information... Done
          Selecting previously deselected package openjdk-6-jre-lib.
          (Reading database ... 62293 files and directories currently installed.)
          Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
          ...
          Processing triggers for man-db ...
          ...
          Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
          
          Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
          ...
          

          如您所见,update-alternatives 没有被触发。

          安装后,/var/lib/dpkg/alternatives 中没有 Java 二进制文件,/etc/alternatives 中没有链接,/usr/bin 中也没有链接。

          删除/var/lib/dpkg/alternatives 中的文件也会破坏update-java-alternatives

          【讨论】:

            【解决方案10】:

            Ubuntu 12.04 这工作...

            JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386/jre

            【讨论】:

              【解决方案11】:

              作为 fedora 用户的更新,替代设置当前 java 目录为 /usr/java/默认

              所以你必须将你的 JAVA_HOME 设置为 /usr/java/default 以在你的类路径中总是有替代的当前选择

              HTH!

              【讨论】:

                【解决方案12】:

                我总是倾向于根据/usr/bin/java来设置JAVA_HOME。

                JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"
                

                这样,两个选项都指向同一个位置

                【讨论】:

                  【解决方案13】:

                  据我所知,我使用的是 update-java-alternatives 脚本,而不是 update-alternatives。它确实为我正确设置了 JAVA_HOME。

                  【讨论】:

                  • 在 Ubuntu 20.4 中没有
                  【解决方案14】:

                  请查看 update-alternatives 命令的作用(它有一个好人...)。

                  简而言之 - 当您拥有 java-sun-1.4 和 java-opensouce-1.0 时会发生什么......哪一个使用“java”? debian "/usr/bin/java" 是符号链接,"/usr/bin/java-sun-1.4" 是 "/usr/bin/java" 的替代品

                  编辑: 正如理查德所说,update-alternatives 是不够的。您实际上需要使用update-java-alternatives。更多信息:

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

                  【讨论】:

                  • 更新替代方案是不够的。它需要是 update-java-alternatives
                  • @Richard:是的,注意到了。我第一次想到它,所以我用谷歌搜索,找到了 Ubuntu 的文档。谢谢!
                  【解决方案15】:

                  我的正确目标一直是从 Sun 下载它并以这种方式安装。然后你就知道所有东西都在哪个目录了。

                  但是,如果您更喜欢 Debian 安装它的奇怪方式,我最好的猜测是 java 和 javac 二进制文件所在的父目录。

                  (因为当您在路径中指定它时,它是 $JAVA_HOME/bin) (所以在你的情况下,它将是 ... $JAVA_HOME/share 和 $JAVA_HOME 将是 /usr ?)

                  呃,这听起来不对……

                  我也很想知道这个问题的答案!

                  【讨论】:

                  • 使用 debian 时,您确实需要保持 debian 结构,否则以后的系统更新将使您的系统损坏。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-05-21
                  • 2017-09-08
                  • 1970-01-01
                  • 2011-04-04
                  • 2017-03-31
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多