2009-11-06 82 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.") 
    } 
}