【问题标题】:Expanation for the inconsitency regarding java installtion paths in unix?关于 unix 中 java 安装路径不一致的解释?
【发布时间】:2014-05-27 10:19:26
【问题描述】:

我在我的系统中安装了 java 大约 6 个月。我在这里盲目地遵循了这个 document's 指令。我下载了jdk,解压,根据文档中的说明设置路径Java_Home,Path。

今天我想知道,我的系统中安装了哪些 java 以及安装在哪里。所以,我在网上查了一下,运行了这个命令

readlink -f $(哪个java)

它说

/usr/local/java/jre1.7.0_40/bin/java

但是当我检查 Java_Home 变量时,它说

/usr/lib/jvm/jdk1.7.0_40

这里两个路径都引用jdk 1.7,但是它们是不同的。一个在 /usr/lib/jvm,另一个在 /user/local/java。

我认为,由于一些混乱,我错误地设置了 java_home。我一定在几个地方有 unpakced jdk。而且,在设置 java_home 时,我选择了不正确的路径。要么是那个,要么是两个位置之间的某种联系,这是由于我运行了一些我不知道的命令而发生的。

无论如何,我可以正确运行 java 程序并运行 eclipse 等,所以一切都很好,因此我从未注意到这一点。

但是,我想知道是否需要修复 java_home 变量以确保上述两个命令返回相同的值。而且,如果没有必要,为什么当 'readlink -f $(which java)' 和 java_home 返回不同的路径时这个设置可以正常工作。

【问题讨论】:

    标签: java unix environment-variables


    【解决方案1】:

    readlink -f $(which java) 只是告诉您当您在 shell 中键入 java 时执行哪个文件。 JAVA_HOME是一些程序用来定位java的环境变量。由于这两个变量都指向1.7 jre/jdk,因此它们的不同应该无关紧要。使用JAVA_HOME 的程序将使用JDK java,而仅使用java 命令行的程序将使用JRE 版本。

    如果您确实需要将它们更改为指向同一个 java,那么您应该更改您的 JAVA_HOME 而是您的 java 符号链接,因为指向 JDK 通常比指向 JRE,因为某些程序要求 JAVA_HOME 必须指向 JDK(例如,因为这些程序需要 JRE 中未包含的 javac)。

    【讨论】:

      【解决方案2】:

      您的 JAVA_HOME 应该与您选择的 Java 版本相匹配。我将我的 JAVA_HOME 设置为:

      export JAVA_HOME=`readlink -f  /usr/bin/javac | sed 's|/bin/javac||g'`
      

      我使用 Debain/Ubuntu update-java-alternatives 命令来选择我使用的 Java 版本。它确保它不仅更新/usr/bin/java,还更新所有其他Java 命令,如javacjavadoc

      sudo update-java-alternatives --set java-7-oracle
      

      您可以获得系统上安装的 Java 发行版的列表:

      update-java-alternatives -l
      

      大多数程序不依赖 both JAVA_HOME 和 java 在您的路径中。通常,它们依赖于一个或另一个,但不是两者都依赖。因此,对于任何给定的应用程序,它可能会运行,但不同的应用程序可能会使用不同版本的 Java 运行。根据我的经验,大多数已安装的 java 应用程序将使用/usr/bin/java,大多数开发环境将使用 JAVA_HOME。

      正确指定 JAVA_HOME 和设置 /usr/bin/java 可确保几乎所有 Java 应用程序都使用您首选(和最新)版本的 Java 运行。

      但是,该规则有一些值得注意的例外。一些在 Java 下运行的程序有自己的配置来选择他们使用的 Java 版本。

      例如,我运行 tomcat7 服务器,我必须有配置文件 /usr/share/tomcat7/bin/setenv.sh 为该应用程序设置 JAVA_HOME 目录:

      JAVA_HOME=`readlink -f  /usr/bin/javac | sed 's|/bin/javac||g'`
      JAVA_OPTS="-Xms256m -Xmx2048m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=512M -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
      

      Eclipse completely ignore JAVA_HOME 等其他程序。它有自己的算法来确定它将在哪个版本的 Java 下运行,并有一个 -vm 命令行选项,允许您指定您的偏好。

      【讨论】:

      • 但是如果它们和我的设置不同的话应该不会有任何问题..
      【解决方案3】:

      这是两个不同的东西。

      第一个告诉您 JRE(Java 运行时环境),即 java 二进制文件所在的位置。您需要它来运行 JAR 文件。

      JAVA_HOME 告诉您 JDK(Java 开发工具包)和 javac 二进制文件的位置。您需要它来编译和打包 JAR 文件。

      【讨论】:

        猜你喜欢
        • 2016-10-22
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多