Windows 10/11

Übersicht

Dieses Skript installiert automatisch Java 25 unter Windows mithilfe des Windows Package Managers (winget).

Download

Voraussetzungen

Anforderungen:

  • Windows 10 (Version 1809+) oder Windows 11

  • Windows Package Manager (winget) - normalerweise auf modernen Windows-Systemen vorinstalliert

Ausführung:

Doppelklicke einfach auf install_java25_windows.cmd oder führe es über die Eingabeaufforderung aus. Das Skript fordert bei Bedarf automatisch Administratorrechte an.

Was das Skript macht

1. Alte Java-Installationen deinstallieren

Das Skript durchsucht die Windows-Registrierung und entfernt alle vorhandenen Java-Installationen:

# Search for Java installations in registry
$registryPaths = @(
    "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*",
    "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*",
    "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
)

# Pattern matching for Java vendors
$vendorPattern = "(?i)(Temurin|Adoptium|AdoptOpenJDK|OpenJDK|Microsoft Build of OpenJDK|Oracle JDK|Oracle Java|Corretto|Zulu|Semeru)"

# Uninstall using MSI product code or quiet uninstall string
msiexec.exe /x {PRODUCT_CODE} /qn /norestart

Nach der Deinstallation der Pakete entfernt das Skript übrig gebliebene Verzeichnisse:

# Remove Java directories
Remove-Item "C:\Program Files\Java\*" -Recurse -Force
Remove-Item "C:\Program Files\Eclipse Adoptium\*" -Recurse -Force
Remove-Item "C:\Program Files\Temurin\*" -Recurse -Force
# ... and more

2. Java über Winget installieren

Das Skript verwendet den Windows Package Manager, um Java 25 zu installieren:

# Update winget sources
winget source update

# Install Eclipse Adoptium Temurin 25 JDK
winget install --id EclipseAdoptium.Temurin.25.JDK --exact --source winget `
    --silent --scope machine --disable-interactivity `
    --accept-source-agreements --accept-package-agreements

3. Installiertes Java lokalisieren

Das Skript sucht nach dem installierten Java in gängigen Verzeichnissen:

# Search in common installation directories
$roots = @(
    "C:\Program Files\Eclipse Adoptium",
    "C:\Program Files\Temurin",
    "C:\Program Files\Java"
)

# Find directories matching jdk-25* with javac.exe
Get-ChildItem -Path $root -Directory |
    Where-Object {
        $_.Name -match "^jdk-?25" -and
        (Test-Path (Join-Path $_.FullName "bin\javac.exe"))
    }

4. Umgebungsvariablen konfigurieren

Das Skript erstellt einen stabilen Junction-Point und konfiguriert Umgebungsvariablen:

# Create a stable junction at C:\Program Files\Java\jdk-25
# pointing to the actual installation directory
New-Item -Path "C:\Program Files\Java\jdk-25" -ItemType Junction -Target $detectedJavaHome

# Set JAVA_HOME environment variable (Machine and User level)
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-25", "Machine")
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-25", "User")

Der PATH wird von alten Java-Einträgen bereinigt und aktualisiert:

# Remove all old Java paths
$javaPathPattern = "(?i)(\\Java(\\|$)|\\Eclipse Adoptium(\\|$)|\\Temurin(\\|$)|...)"

# Clean PATH and add new Java bin directory at the front
$cleanPath = # ... cleaned path without old Java entries
$newPath = "C:\Program Files\Java\jdk-25\bin;" + $cleanPath

# Set the new PATH
[Environment]::SetEnvironmentVariable("Path", $newPath, "Machine")

Anschließend sendet das Skript Umgebungsänderungen an alle Anwendungen:

# Notify Windows that environment variables changed
# This uses Windows API SendMessageTimeout to broadcast WM_SETTINGCHANGE
[Win32.NativeMethods]::SendMessageTimeout(
    $HWND_BROADCAST,
    $WM_SETTINGCHANGE,
    [IntPtr]::Zero,
    "Environment",
    $SMTO_ABORTIFHUNG,
    5000,
    [ref]$result
)

5. Installation überprüfen

Abschließend testet das Skript, ob Java korrekt funktioniert:

# Create a test Java file
@'
public class HelloJava25 {
    public static void main(String[] args) {
        System.out.println("Java 25 smoke test");
    }
}
'@ | Set-Content -Path $sourceFile -Encoding ASCII

# Compile and run the test
& "$env:JAVA_HOME\bin\javac.exe" $sourceFile
$output = & "$env:JAVA_HOME\bin\java.exe" -cp $tempDir "HelloJava25"

# Verify output
if ($outputText -ne "Java 25 smoke test") {
    throw "The Java 25 smoke test failed."
}

# Show installed versions
& java.exe -version
& javac.exe -version

Fehlerbehebung

Winget nicht gefunden:

Installiere den Windows Package Manager aus dem Microsoft Store oder aktualisiere Windows.

Zugriff verweigert:

Klicke mit der rechten Maustaste auf das Skript und wähle „Als Administrator ausführen“.

Umgebungsvariablen in der aktuellen Sitzung nicht aktualisiert:

Schließe die Eingabeaufforderung oder das Terminal und öffne es erneut. Die Änderungen sind systemweit, erfordern aber eine neue Sitzung.

Alte Java-Installationen nicht entfernt:

Einige Installationen müssen möglicherweise manuell über Einstellungen > Apps entfernt werden.

Smoke-Test fehlgeschlagen:

Führe das Skript erneut aus oder überprüfe manuell mit java -version in einer neuen Eingabeaufforderung.