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

时间:2009-02-18 12:08:05

标签: java sdk environment-variables

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

6 个答案:

答案 0 :(得分:35)

您可以根据需要安装任意数量的Java版本。

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

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

由于脚本可能依赖于JAVA_HOME自我启动,因此修改JAVA_HOME的新Java安装会很麻烦:所有这些脚本突然必须使用新的潜在不兼容的方式启动JVM。

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


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建议:

  

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

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

这根本不值得。

答案 1 :(得分:10)

我认为JAVA_HOME不是Sun发明或支持的惯例。

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

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

答案 2 :(得分: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

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

答案 3 :(得分:1)

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

答案 4 :(得分: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

希望这有帮助。

答案 5 :(得分:-1)

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