为什么Java SDK安装程序没有设置JAVA_HOME?

我总是想知道为什么我必须在安装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上弄乱环境变量。

您可以根据需要安装任意数量的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(不要忘记通过“install”,只能引用“复制”:JDK / JRE并不总是安装在设置)

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

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

嗯……很好。 为了每天处理大量的部署问题(对于我店里的内部应用程序),我可以向你保证:这是非常理智的“偏执”待遇。
当您部署到(非常)大型用户集时,您不希望对其平台和配置做出任何假设。 “显然WANTS”是我不敢做的假设(或者我将我的手机重定向到你的手机;)并且你处理了愤怒的电话。

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

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

假设那些脚本想要他们的JAVA_HOME设置……并且没有任何东西可以工作了。

…… 罗伯特·格兰特(Robert Grant )对此进行了现场评论:

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

虽然这可能是也可能不是,但这也恰恰说明了我的观点:
“你不想做任何假设”:不对他们的平台/设置做出任何假设,也不对他们的“最佳实践”做出假设。
前者可能听起来很偏执,后者是普通常识:认为你的产品(这里是一个JDK设置)不会破坏用户环境中的任何东西,因为用户“正确”地想出了他的脚本……会疯了。


GvS建议:

或者它可以选择执行此操作,默认情况下禁用

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

这根本不值得。

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

他们可能还记得CLASSPATH环境变量**的惨败,并且更喜欢让它远离环境变量。

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

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 

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

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

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

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

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

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

希望这可以帮助。

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