2009-11-06 77 views
3

This question詢問如何在Windows中設置路徑變量以包含Java bin目錄,從而允許您使用提示中的javac命令。發佈到這個問題的解決方案聲明,您應該對最新的Java安裝的絕對路徑進行硬編碼。當Java自動更新時更新Windows路徑變量?

在這種情況下,它碰巧是c:\program files\java\jdk1.6.0_16\bin

我相信曾經的Java更新17,18及以後安裝到您的javac CMD仍然會採用此舊版本,是否正確?

我錯過了什麼?有沒有辦法將其設置爲自動使用最近安裝的Java更新?

回答

5

我相信曾經的Java更新17,18及以後安裝到您的javac CMD仍然會採用此舊版本,是否正確?

正確。當java更新時,更新的是JRE(java運行時環境)

這會自動設置您的java插件(在瀏覽器中使用)並將您的java命令設置爲最新版本。 (打開終端並鍵入java -version)

包含javac的SDK(Java SDK)是而不是已更改。你必須手動完成。

其中一個選擇是做什麼mhaller說。

我在Windows中進一步使用環境變量。

MYPC/RigthClick /屬性/ Advaced/EnvironmentVariables/

從那裏我添加JAVA_HOME poiting到所需JDK路徑(C:\ jsdk_x_x_x)和設置PATH變量:

whatever;_it_had;_before;%JAVA_HOME%\bin 

有沒有辦法將其設置爲自動使用最近安裝的java更新?

對於JRE會被自動設置,對於SDK你只需要修改系統變量和更改JAVA_HOME

2

使用變量由Java安裝程序,而不是設置:

set path="%path%;%JAVA_HOME%\bin" 
0

下面的PowerShell腳本的價值都非常好,這一點:

Remove-PathFolders -Folders "*\Java\jdk*" -EnvironmentVariableTarget $([System.EnvironmentVariableTarget]::Machine) 
$jdkDp = (Get-ChildItem -Path "C:\Program Files (x86)\Java\jdk*" | Sort-Object name | Select-Object -Last 1).FullName 
Add-PathFolders -Folders $($jdkDp + "\bin\") -EnvironmentVariableTarget $([System.EnvironmentVariableTarget]::Machine) 
Get-PathFolders -EnvironmentVariableTarget $([System.EnvironmentVariableTarget]::Machine) 

其中使用來自here靈感以下自定義功能(您可以在同一UpdateJavaPath.ps1腳本一切):

<# 
.SYNOPSIS 
Gets the list of folders specified in the Path environment variable. 

.PARAMETER EnvironmentVariableTarget 
Specifies the "scope" to use when querying the Path environment variable 
("Process", "Machine", or "User"). Defaults to "Process" if the parameter is 
not specified. 

.EXAMPLE 
.\Get-PathFolders.ps1 
C:\Windows\system32\WindowsPowerShell\v1.0\ 
C:\Windows\system32 
C:\Windows 
C:\Windows\System32\Wbem 
... 

Description 
----------- 
The output from this example lists each folder in the Path environment variable 
for the current process. 

.EXAMPLE 
.\Get-PathFolders.ps1 User 
C:\NotBackedUp\Public\Toolbox 

Description 
----------- 
The output from this example assumes one folder 
("C:\NotBackedUp\Public\Toolbox") has previously been added to the user's Path 
environment variable. 
#> 
Function Get-PathFolders() { 
    param(
     [string] $EnvironmentVariableTarget = "Process") 

    Set-StrictMode -Version Latest 
    $ErrorActionPreference = "Stop" 

    [string[]] $pathFolders = [Environment]::GetEnvironmentVariable(
     "Path", 
     $EnvironmentVariableTarget) -Split ";" 

    If ($pathFolders -ne $null) 
    { 
     Write-Output $pathFolders 
    } 
} 

<# 
.SYNOPSIS 
Adds one or more folders to the Path environment variable. 

.PARAMETER Folders 
Specifies the folders to add to the Path environment variable.. 

.PARAMETER EnvironmentVariableTarget 
Specifies the "scope" to use for the Path environment variable ("Process", 
"Machine", or "User"). Defaults to "Process" if the parameter is not specified. 

.EXAMPLE 
.\Add-PathFolders.ps1 C:\NotBackedUp\Public\Toolbox 
#> 
Function Add-PathFolders() { 
    param(
     [parameter(Mandatory = $true, ValueFromPipeline = $true)] 
     [string[]] $Folders, 
     [string] $EnvironmentVariableTarget = "Process") 

    begin 
    { 
     Set-StrictMode -Version Latest 
     $ErrorActionPreference = "Stop" 

     Write-Verbose "Path environment variable target: $EnvironmentVariableTarget" 

     [bool] $isInputFromPipeline = 
      ($PSBoundParameters.ContainsKey("Folders") -eq $false) 

     [int] $foldersAdded = 0 

     [string[]] $pathFolders = [Environment]::GetEnvironmentVariable(
      "Path", 
      $EnvironmentVariableTarget) -Split ";" 

     [Collections.ArrayList] $folderList = New-Object Collections.ArrayList 

     $pathFolders | foreach { 
      $folderList.Add($_) | Out-Null 
     } 
    } 

    process 
    { 
     If ($isInputFromPipeline -eq $true) 
     { 
      $items = $_ 
     } 
     Else 
     { 
      $items = $Folders 
     } 

     $items | foreach { 
      [string] $folder = $_ 

      [bool] $isFolderInList = $false 

      $folderList | foreach { 
       If ([string]::Compare($_, $folder, $true) -eq 0) 
       { 
        Write-Verbose ("The folder ($folder) is already included" ` 
         + " in the Path environment variable.") 

        $isFolderInList = $true 
        return 
       } 
      } 

      If ($isFolderInList -eq $false) 
      { 
       Write-Verbose ("Adding folder ($folder) to Path environment" ` 
        + " variable...") 

       $folderList.Add($folder) | Out-Null 

       $foldersAdded++ 
      } 
     } 
    } 

    end 
    { 
     If ($foldersAdded -eq 0) 
     { 
      Write-Verbose ("No changes to the Path environment variable are" ` 
       + " necessary.") 

      return 
     } 

     [string] $delimitedFolders = $folderList -Join ";" 

     [Environment]::SetEnvironmentVariable(
      "Path", 
      $delimitedFolders, 
      $EnvironmentVariableTarget) 

     Write-Verbose ("Successfully added $foldersAdded folder(s) to Path" ` 
      + " environment variable.") 
    } 
} 

<# 
.SYNOPSIS 
Removes one or more folders from the Path environment variable. 

.PARAMETER Folders 
Specifies the folders to remove from the Path environment variable.. 

.PARAMETER EnvironmentVariableTarget 
Specifies the "scope" to use for the Path environment variable ("Process", 
"Machine", or "User"). Defaults to "Process" if the parameter is not specified. 

.EXAMPLE 
.\Remove-PathFolders.ps1 C:\NotBackedUp\Public\Toolbox 
#> 
Function Remove-PathFolders(){ 
    param(
     [parameter(Mandatory = $true, ValueFromPipeline = $true)] 
     [string[]] $Folders, 
     [string] $EnvironmentVariableTarget = "Process") 

    begin 
    { 
     Set-StrictMode -Version Latest 
     $ErrorActionPreference = "Stop" 

     Write-Verbose "Path environment variable target: $EnvironmentVariableTarget" 

     [bool] $isInputFromPipeline = 
      ($PSBoundParameters.ContainsKey("Folders") -eq $false) 

     [int] $foldersRemoved = 0 

     [string[]] $pathFolders = [Environment]::GetEnvironmentVariable(
      "Path", 
      $EnvironmentVariableTarget) -Split ";" 

     [Collections.ArrayList] $folderList = New-Object Collections.ArrayList 

     $pathFolders | foreach { 
      $folderList.Add($_) | Out-Null 
     } 
    } 

    process 
    { 
     If ($isInputFromPipeline -eq $true) 
     { 
      $items = $_ 
     } 
     Else 
     { 
      $items = $Folders 
     } 

     $items | foreach { 
      [string] $folder = $_ 

      [bool] $isFolderInList = $false 

      for ([int] $i = 0; $i -lt $folderList.Count; $i++) 
      { 
       #If ([string]::Compare($folderList[$i], $folder, $true) -eq 0) 
       if (($folderList[$i] -like $folder) -or ($folderList[$i] -eq "")) 
       { 
        $isFolderInList = $true 

        Write-Verbose ("Removing folder ($folderList[$i]) from Path" ` 
         + " environment variable...") 

        $folderList.RemoveAt($i) 
        $i-- 

        $foldersRemoved++ 
       } 
      } 

      If ($isFolderInList -eq $false) 
      { 
       Write-Verbose ("The folder ($folder) is not specified in the Path" ` 
        + " list.") 

      } 
     } 
    } 

    end 
    { 
     If ($foldersRemoved -eq 0) 
     { 
      Write-Verbose ("No changes to the Path environment variable are" ` 
       + " necessary.") 

      return 
     } 

     [string] $delimitedFolders = $folderList -Join ";" 

     [Environment]::SetEnvironmentVariable(
      "Path", 
      $delimitedFolders, 
      $EnvironmentVariableTarget) 

     Write-Verbose ("Successfully removed $foldersRemoved folder(s) from Path" ` 
      + " environment variable.") 
    } 
}