2009-02-18 68 views
27

我總是想知道爲什麼我必須在安裝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上弄亂環境變量。

+1

因爲Java不需要它。 – EJP 2017-01-07 11:40:00

回答

33

您可以根據需要安裝儘可能多的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」,只能引用「copied」:JDK/JRE是並非始終由安裝程序安裝)

如果您設置了JAVA_HOME,那可能會中斷某些腳本的默認行爲。

因爲不想打擾這取決於的環境變量未設置聲音毫無意義的偏執我假想腳本 - 如果一個腳本這樣做,那麼它顯然想用不同的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

儘管如此,這並不能解釋爲什麼安裝程序在以前沒有設置JAVA_HOME時沒有設置它。 – 2009-02-18 12:39:38

+0

或者它可以選擇做到這一點,默認情況下禁用。 – GvS 2009-02-18 12:41:25

-1

我猜java不想做任何依賴於平臺的事情。在Windows中,類路徑的設置與LINUX/UNIX不同。

+2

在Windows上,它提供了默認安裝在「C:\ Porgram文件」中。我很確定它不會在* nix中這樣做。關鍵是,它已經取決於平臺。 – 2009-02-18 12:22:32

0

我不確定這是爲什麼,因爲安裝程序清楚地解決了依賴於平臺的問題(這當然是JVM的重點)。你確定你沒有把JRE與JSDK混合?

也許有一種方法可以讓你的程序搜索java的安裝位置(這將是我猜的腳本),然後設置JAVA_HOME並將其添加到路徑中。

IBM似乎已經在做這一招:在JRE和JSDK安裝的區別 http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21199220

其他有趣的帖子提示: http://confluence.atlassian.com/display/CONF26/Set+JAVA_HOME+variable+in+Windows

希望這有助於。

+0

IBM鏈接已經死機 – Antimony 2013-05-06 16:10:48

10

我不認爲JAVA_HOME是Sun發明或支持的慣例。

他們可能還記得CLASSPATH環境變量**的慘敗,並且更喜歡遠離環境變量。

**作爲在早期的Java SDK和文獻中設置JVM類路徑的主要方式,並導致用戶和各種應用程序與環境變量相混淆,覆蓋彼此的更改並取決於相互矛盾的內容,鼓勵這種方式。

3

vcvarsall.bat機制是一種便捷的方式,用於Visual C++提供具有正確變量的控制檯而不會混淆用戶的/系統的環境變量。但是,它假設Installshield是將代碼獲取到系統上的唯一方法。 JDK應該允許從一個位置切換到另一個位置。

如果您正在尋找的java.exe,在InstallShield安裝應該把它放在%WINDIR%\ SYSTEM32,所以它是可以上的路徑。

您可以通過查詢註冊表獲得有關安裝的應用程序的位置,一些提示:

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 

但是,你不能靠這個絕對,因爲這使得有關供應商,版本和安裝機制的一些假設。

0

這可能會幫助別人最終像我這樣的結局。我只是想使用Java作爲工具,而不是將其作爲一種生活方式,所以我只需要知道JAVA_HOME如何設置以及爲什麼它不正確。原來的答案是,WinAnt安裝設置JAVA_HOME(以及ANT_HOME),但僅基於當前安裝的Java。因此,如果您需要更改Java版本,並且您使用Ant,則正確的方法是卸載WinAnt,卸載Java,安裝新的Java,然後重新安裝WinAnt。