【问题标题】:Why use $JAVA_HOME or $AIR_HOME instead of just $PATH?为什么要使用 $JAVA_HOME 或 $AIR_HOME 而不仅仅是 $PATH?
【发布时间】:2019-04-25 21:26:36
【问题描述】:

我知道$JAVA_HOME$AIR_HOME 等是什么,我知道如何设置它们。事实上,我正在为使用 Java 或 Adob​​e AIR 而初始化的每个虚拟环境中设置它们,但我不明白为什么要这样做。我的问题更多是关于忽略$*_HOME 变量并仅使用系统提供的二进制文件(在$PATH 中)的后果。

除了查找正确版本的二进制文件之外,它还用于其他用途吗?应用程序似乎从未将它用于其他任何事情,并且包维护者、系统管理员和用户有责任在$PATH 中提供这些内容。有方便的虚拟环境管理器让用户在环境之间轻松切换并选择保存的$PATH 预设,该预设指向给定用户会话的给定二进制文件的正确版本。虽然通常可以编写设置自定义环境变量的“onSwitch”钩子,但它总是需要额外的工作。

有人建议它帮助分叉的应用程序运行与其父级相同版本的二进制文件,但它已经得到照顾,因为两个进程都应该从$PATH 运行二进制文件,而$PATH 由子进程继承来自父母。

Tomcat 和 Gradle 或 Adob​​e AIR 等项目的开发人员依赖 $*_HOME 变量而不是 $PATH 提供的变量的原因是什么?该约定从何而来,为什么仍在使用?

【问题讨论】:

  • 有哪些 Java 开发人员?我从没见过。
  • 大部分工具都使用它。 Maven、Gradle、应用服务器等。这允许使用的版本保持一致。如果您使用 JAVA_HOME 启动一个应用程序,那么该应用程序会使用相同的 JAVA_HOME 启动另一个应用程序,因此两个应用程序使用相同的 java 版本。
  • 我开始认为我问这个问题是个错误,因为无论出于何种原因,很多人似乎都依附于该变量。除此之外,如果我在一个环境中运行一个应用程序并且它运行另一个应用程序它在同一个环境中 - 当有 $PATH 时仍然不需要人工变量。
  • @user207421 例如,我在 Tomcat 和 Gradle 中看到过,编辑了问题。

标签: java air environment-variables


【解决方案1】:

我想只要你只运行一个应用程序或多个应用程序都依赖于相同的 JDK/JRE 版本,你只需要 $PATH 就可以了。但是,如果您有多个依赖于不同 JDK/JRE 版本的应用程序,那么 $_HOME 变量会派上用场。因此,例如,您可以拥有一个 JAVA 8 应用程序和一个仍然使用 JAVA 6 的遗留应用程序,通过不同配置它们的 $_HOME 变量在同一台机器上运行。

如果您没有设置依赖这些环境变量的开源应用程序,您也可能会遇到问题。

【讨论】:

  • 在同一环境中运行最新应用程序和旧应用程序有什么好处?我可以轻松设置两个虚拟环境来分别运行 JAVA 6 和 8 应用程序,而那些仍然只需要它们各自的 $PATH 变量。这样做有很多维护好处。
  • 我在工作中维护了一个这样的开源应用程序的分支(依赖于$*_HOME),我将它重构为使用$PATH 以使维护更容易,没有问题,但我想知道是否我应该把这个改变推到上游。
  • 嗯,并非总是可以使用虚拟环境,例如,如果您使用受许可约束的第三方软件。
  • 怎么回事?无论您在虚拟环境中安装什么,都应该像不在虚拟环境中一样透明地访问所有资源,包括您的许可证绑定的第 3 方软件。并不是说我不能在虚拟环境中安装使用$*_HOME 的东西,相反,我可以而且我可以。问题是我每次安装它时都必须额外配置它以设置该变量。这是因为所述软件试图自行确定正确的绝对路径并失败,而完全可用的$PATH 变量似乎被忽略了。
【解决方案2】:

希望我正确理解了您的问题。

据我所知,这是因为方便和安全(?)。

例如,假设您的 java 目录很长。 C:\Program Files\a\b\c\d\e (x86)\Java\jre1.8.0_201,您设置路径以便您可以轻松访问“bin”文件夹中的 exe 文件。然后你想访问Java的'bin1'文件夹中的exe文件,那么你必须用分号设置另一个长路径来区分它们。然后你想在路径中添加“bin2”文件夹。这不仅会花费您的时间,而且您可能会在打字时出错。 (我的纯粹假设。我应该想出更好的例子。但现在想不出。)

通过设置%JAVA_HOME%,可以方便、安全地设置环境变量。 您可以只添加 %JAVA_HOME%bin %JAVA_HOME%bin1 %JAVA_HOME%bin2 而不是输入长路径。

可能,不同的操作系统有不同风格的设置路径。 (我假设)很久以前,人们在旧操作系统上就这样使用它,这可能成为某种约定或习惯。 (我认为 $JAVA_HOME 的出现是因为人们以前很难设置路径。)

我也有和你类似的想法,我喜欢你的好奇心和推理能力,所以我想用我有限的知识帮助你。希望我的帮助一点点。 (我也希望我能理解你的问题。)

【讨论】:

  • 我理解方便,但老实说,这似乎恰恰相反。您能否举一个实际想要将来自$*_HOME/bin 的可执行文件与来自$*_HOME/bin1 的可执行文件混合的场景示例?
  • @cprn 我的例子很糟糕。哈哈 。就像你一样,我不再使用 HOME 东西了,我只使用路径。一开始,我使用 %home% 是因为我认为我必须使用它。我记得为'bin'文件夹和其他一些文件夹设置路径,但它不是java。我忘了那是什么了。也许如果你有很多java版本(出于测试目的,我实际上在我的工作计算机中有很多版本),也许我可以设置它 %java_home% ,我在java文件夹下有很多java版本,所以我设置的公共路径有%home%,但其余的带有路径。像 %JAVA_HOME%JAVA-7\bin; %JAVA_HOME%Java-8\bin
  • @cprn 我认为有些人可以这样使用它,但不适合我哈哈我只设置路径,当我有一台新计算机或重新安装操作系统时。我不经常这样做。但也许对于一直这样做的人来说,%home% 变量可能会很方便。也许吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多