36

我一直想知道为什么我在安装 Java SDK 之后必须手动设置 JAVA_HOME 环境变量。

JAVA_HOME=c:\Program Files\Java\jdk1.6.0_12

Visual Studio 至少提供了一个批处理文件来设置这些类型的环境变量:

调用“c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat”

Java有类似的东西吗?我正在尝试制作一个在安装 Java SDK 后应该可以正常工作的构建脚本。我不希望人们在他们的 PC 上弄乱环境变量。

4

6 回答 6

39

您可以安装任意多个版本的 Java。

安装程序修改本地环境变量(例如 )会很危险JAVA_HOME,因为它可能会引用现有的 Java 安装。

这与所谓的“平台相关问题”无关。;)

由于脚本可能依赖于JAVA_HOME自己启动,再次,这对于新的 Java 安装进行修改将是灾难性的JAVA_HOME:所有这些脚本将突然必须使用新的可能不兼容的 JVM 启动。

另外,通过设置$JAVA_HOME/bin%JAVA_HOME%/bin在您的路径中,您可以动态更改JAVA_HOME为您想要使用的任何 Java 版本,而无需过多使用 PATH 变量。


Michael Borgwardt在评论中提出了有趣的后续问题

尽管如此,这并不能解释为什么安装程序在以前根本没有设置 JAVA_HOME 时没有设置它。

答案很简单:

安装程序无法知道脚本是否已经依赖JAVA_HOME.

含义:某些脚本可以测试JAVA_HOME值,如果未设置,则引用安装在其他地方的另一个 JVM(不要忘记,通过“安装”,只能引用“复制”:JDK/JRE 并不总是由设置)

如果设置JAVA_HOME,这可能会破坏某些脚本的默认行为。

不想打扰依赖于未设置 env var 的假设脚本对我来说听起来毫无意义的偏执 - 如果脚本这样做,那么它显然希望在安装时使用不同的 JVM - 没有理由避免这种情况。

嗯……甜。对于每天处理大量部署问题(用于我商店的内部应用程序),我可以向您保证:拥有它是非常理智的“偏执狂”对待。
当您部署到(非常)大量用户时,您不想对他们的平台和配置做出任何假设。“显然想要”是我不敢做出的假设(或者我将手机重定向到您的手机;)并且您处理愤怒的电话)。

例如,我们有许多脚本使用 sun 的 1.4.2 JVM 启动(开发平台上未设置 JAVA_HOME,直接在脚本中设置默认路径),或者使用 JRockit 的 1.4.2(JAVA_HOME设置,因为它是预期目标集成、预生产和生产平台)。

但是我们会定期安装新的 JDK1.6.x,因为我们使用它来启动 eclipse。

假设那些脚本想要他们的JAVA_HOME设置......并且没有任何效果了。

... 罗伯特格兰特对此进行了现场评论:

您正在描述需要一个特定版本的脚本,但仍然查看全局 JAVA_HOME。那只是经过深思熟虑的脚本。

虽然这可能是真的,也可能不是,但这也准确地说明了我的观点:
“你不想做任何假设”:不假设他们的平台/设置,也不假设他们的“最佳实践”。
前者可能听起来偏执,后者是普通常识:认为您的产品(这里是 JDK 设置)不会破坏用户环境中的任何内容,因为用户“正确”地考虑了他的脚本......这太疯狂了。


GvS建议:

或者它可以选择这样做,默认情况下禁用

这将意味着在设置屏幕中包含另一个选项,该选项应该由用户仔细查看,并且可能会产生意想不到的后果,即使用户选择它时认为他知道自己在做什么......

这根本不值得。

于 2009-02-18T12:27:02.037 回答
11

我不认为 JAVA_HOME 是 Sun 发明或支持的约定。

他们可能还记得 CLASSPATH 环境变量**的惨败,并且更愿意远离环境变量。

** 这在早期的 Java SDK 和文献中被鼓励作为设置 JVM 类路径的主要方法,并导致用户和各种应用程序弄乱环境变量,覆盖彼此的更改并依赖相互矛盾的内容。

于 2009-02-18T12:38:23.600 回答
3

vcvarsall.bat机制是 Visual C++ 为控制台提供正确变量而不会弄乱用户/系统的环境变量的便捷方式但是,它假定 Installshield 是将代码导入系统的唯一方法。JDK 应该容忍从一个位置剪切到另一个位置。

如果您正在寻找java.exe,Installshield 安装程序应将其放在%windir%\system32中,因此它在 PATH 中可用。

您可以通过查询注册表获得有关已安装应用程序位置的一些提示:

C:>REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6" /v JavaHome

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\1.6
    JavaHome    REG_SZ  C:\dev\Java\jdk1.6.0_05

但是,您不能完全依赖这一点,因为这会对供应商、版本和安装机制做出一些假设。

于 2009-02-18T13:22:39.453 回答
1

这可能会帮助像我这样最终来到这里的其他人。我只是想将 Java 用作一种工具,而不是将其作为一种生活方式,所以我只需要知道 JAVA_HOME 是如何设置的以及为什么它不正确。答案原来是 WinAnt 安装设置了 JAVA_HOME(连同 ANT_HOME),但仅基于当前安装的 Java。因此,如果您需要更改 Java 的版本,并且您正在使用 Ant,那么正确的做法是卸载 WinAnt,卸载 Java,安装新的 Java,然后重新安装 WinAnt。

于 2012-05-04T03:07:37.440 回答
0

我不确定为什么会这样,因为安装程序清楚地解决了平台相关问题(这当然是 JVM 的重点)。您确定没有将 JRE 与 JSDK 混合使用吗?

也许有一种方法可以让您的程序搜索安装 java 的位置(我猜这将是一个脚本),然后设置 JAVA_HOME 并可能将其添加到路径中。

IBM 似乎已经在做这个技巧了: http ://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21199220

其他有趣的帖子暗示了 JRE 和 JSDK 安装之间的区别:http: //confluence.atlassian.com/display/CONF26/Set+JAVA_HOME+variable+in+Windows

希望这可以帮助。

于 2009-02-18T12:25:20.513 回答
-1

我猜java不想做任何依赖于平台的事情。在 Windows 中,类路径的设置与 LINUX/UNIX 不同。

于 2009-02-18T12:13:56.267 回答