Actualização do Windows variável de caminho quando o Java é atualizada automaticamente?

StackOverflow https://stackoverflow.com/questions/1690815

  •  18-09-2019
  •  | 
  •  

Pergunta

Esta pergunta pergunta-como configurar a variável path do Windows para incluir o Java bin permitindo a você usar o javac comando a partir da linha de comandos.A solução postado para esta pergunta indica que você deve codificar o caminho absoluto do Java mais recente instalação.

Neste caso, ele passa a ser c:\program files\java\jdk1.6.0_16\bin

Eu acredito que uma vez que o Java update 17, 18 e além estiverem instalados, o javac cmd ainda estará usando essa versão mais antiga, correto?

Eu estou faltando alguma coisa??Há uma maneira de definir isto para automaticamente usar o mais recente instalado o java update??

Foi útil?

Solução

Eu acredito que uma vez que o Java update 17, 18 e além estiverem instalados, o javac cmd ainda estará usando essa versão mais antiga, correto?

Corrigir.Quando o java é a atualização, o que se atualizado é o JRE ( java runtime environment )

Que definir automaticamente o seu plugin java ( usado no navegador ) e o comando java definido para a versão mais recente.( Abra um terminal e digite java-version )

O SDK ( Java SDK ), que contém o javac é não alterado.Você tem que fazê-lo manualmente.

Uma opção é fazer o que mhaller diz.

Eu vou continuar a usar as variáveis de ambiente no Windows.

Meupc/RigthClick/Propriedades/Avanços/EnvironmentVariables/

A partir daí eu adicionar JAVA_HOME poiting para o desejado caminho do JDK ( c:\jsdk_x_x_x ) e definir a variável PATH para:

 whatever;_it_had;_before;%JAVA_HOME%\bin

Há uma maneira de definir isto para automaticamente usar o mais recente instalado o java update??

Para o JRE seria definido automaticamente, para o SDK, você só precisará modificar as variáveis do sistema e alterar o valor de JAVA_HOME

Outras dicas

Use a variável definida pelo instalador Java:

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

O script PowerShell a seguir funciona muito bem para isso:

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)

Que usam as seguintes funções personalizadas inspiradas em aqui (você pode incluir tudo no mesmo UpdateJavaPath.ps1 roteiro):

<#
.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.")
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top