Java自动更新时更新Windowspathvariables?

这个问题询问如何在Windows中设置你的pathvariables来包含Java bin目录,允许你使用提示中的javac命令。 发布到这个问题的解决scheme声明你应该硬编码最新的Java安装的绝对path。

在这种情况下恰好是c:\program files\java\jdk1.6.0_16\bin

我相信一旦Java更新17,18和更高版本安装您的javac cmd仍然会使用这个较旧的版本,正确的?

我错过了什么? 有没有办法将其设置为自动使用最近安装的Java更新?

我相信一旦Java更新17,18和更高版本安装您的javac cmd仍然会使用这个较旧的版本,是否正确?

正确。 当java更新时,得到更新的是JRE(java运行时环境)

这会自动设置您的java插件(在浏览器中使用),并将您的java命令设置为最新版本。 (打开一个终端并键入java -version)

包含javac的SDK(Java SDK) 不会更改。 你必须手动完成。

一个选择是做什么哈勒勒说。

我进一步使用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的值

改用Java安装程序设置的变量:

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

以下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) 

其中使用了以下自定义函数(可以将所有内容包含在同一个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.") } }