سؤال

هذا السؤال يسأل كيفية إعداد متغير المسار الخاص بك في Windows لتضمين دليل Java Bin يسمح لك باستخدام أمر Javac من المطالبة. ينص الحل الذي تم نشره على هذا المسألة أنه يجب عليك الكود الصعب المسار المطلق لآخر تثبيت جافا.

في هذه الحالة يحدث أن يكون c:\program files\java\jdk1.6.0_16\bin

أعتقد بمجرد تثبيت Java Update 17، 18 وما بعده، فستظل Javac CMD سيستخدم هذا الإصدار الأقدم، صحيح؟

هل فاتني شيء؟؟ هل هناك طريقة لتعيين هذا لاستخدام تحديث Java آخر تلقائيا؟

هل كانت مفيدة؟

المحلول

أعتقد بمجرد تثبيت Java Update 17، 18 وما بعده، فستظل Javac CMD سيستخدم هذا الإصدار الأقدم، صحيح؟

صيح. عندما يكون جافا تحديث، ما يحصل على تحديث هو JRE (بيئة وقت تشغيل Java)

تعمل تلقائيا على تعيين البرنامج المساعد Java الخاص بك (المستخدم في المتصفح) وأمر Java الخاص بك المحدد على أحدث إصدار. (افتح محطة ونوع Java -version)

SDK (Java SDK) الذي يحتوي على Javac هو ليس تغير. عليك أن تفعل ذلك يدويا.

خيار واحد هو ما يقوله mhaller.

أذهب كذلك باستخدام متغيرات البيئة في ويندوز.

MYPC / RIGHCLICK / خصائص / المدارس / البيئة

من هناك، أضيف Java_home Poiting إلى مسار JDK المطلوب (C: JSDK_X_X_X) وتعيين متغير المسار إلى:

 whatever;_it_had;_before;%JAVA_HOME%\bin

هل هناك طريقة لتعيين هذا لاستخدام تحديث Java آخر تلقائيا؟

بالنسبة إلى JRE، سيتم ضبطه تلقائيا، لكي تحتاج SDK فقط إلى تعديل متغيرات النظام وتغيير قيمة JAVA_HOME

نصائح أخرى

استخدم المتغير المحدد بواسطة برنامج Java Installer بدلا من ذلك:

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.")
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top