我总是想知道为什么在安装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上弄乱环境变量。
答案 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 - 没有理由避免这种情况。
例如,我们有许多脚本使用来自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不同。