Jak rozwiązać konflikt wersji JDK 8 i JDK 17 w Windows

Marek Radoszewski Marek Radoszewski
Narzędzia i Praktyki
24.02.2026 9 min
Jak rozwiązać konflikt wersji JDK 8 i JDK 17 w Windows

Jak rozwiązać konflikt wersji JDK 8 i JDK 17 w jednym systemie Windows?

„Jak rozwiązać konflikt wersji JDK 8 i JDK 17 w jednym systemie Windows?” to problem, który wraca jak bumerang u wielu programistów. Praca równocześnie nad starszym projektem w Javie 8 i nowym w Javie 17 na jednym komputerze z Windows potrafi być wyzwaniem. Systemowe zmienne środowiskowe, różne ustawienia IDE i narzędzi budowania często prowadzą do konfliktów.

Jednego dnia utrzymujesz aplikację opartą o JDK 8, a drugiego rozwijasz świeży projekt oparty o JDK 17. Windows nie zawsze „zgaduje” poprawną wersję środowiska Java. Gdy java -version w konsoli pokazuje coś innego niż oczekujesz, pojawiają się błędy kompilacji, problemy z uruchomieniem i niejasne komunikaty w stylu „unsupported major.minor version”.

W tym przewodniku zobaczysz, jak uporządkować wiele wersji JDK na jednym systemie, tak aby płynnie przełączać się między JDK 8 i JDK 17. Poznasz zarówno ręczne metody, jak i wygodniejsze podejścia oparte na skryptach oraz konfiguracji w IDE. Wszystkie opisane techniki możesz zastosować krok po kroku w praktyce.

Na końcu będziesz w stanie świadomie zarządzać JAVA_HOME, zmienną PATH oraz konfiguracją Javy w swoim IDE. Dzięki temu unikniesz losowych błędów, przyspieszysz pracę i odzyskasz kontrolę nad swoim środowiskiem programistycznym w Windows.

Ekran konfiguracji zmiennych środowiskowych Windows z ustawioną ścieżką JAVA_HOME dla JDK 8 i JDK 17, pokazujący jak rozwiązać konflikt wersji JDK w jednym systemie

Dlaczego konflikt JDK 8 i JDK 17 w Windows w ogóle się pojawia?

Aby zrozumieć, jak rozwiązać konflikt wersji JDK 8 i JDK 17 w jednym systemie Windows, trzeba najpierw wiedzieć, z czego on wynika. Java to nie tylko język, lecz cały Java Development Kit (JDK) zawierający kompilator javac, maszynę wirtualną java i zestaw narzędzi. Każda wersja JDK instaluje się w osobnym katalogu i może być niezależnie używana.

Kłopoty pojawiają się wtedy, gdy na jednym systemie masz zainstalowane co najmniej dwie wersje JDK, na przykład JDK 8 (wciąż popularne w projektach korporacyjnych) oraz JDK 17 (najnowsza wersja LTS). Windows korzysta z mechanizmu zmiennych środowiskowych, który nie zawsze jest intuicyjny. To właśnie tam kryje się źródło większości konfliktów.

Najważniejsze są dwie zmienne:

  • JAVA_HOME – wskazuje katalog, w którym zainstalowane jest konkretne JDK, np.
    C:\Program Files\Java\jdk1.8.0_301 lub C:\Program Files\Java\jdk-17.
  • PATH – lista katalogów, w których Windows szuka programów wykonywalnych, takich jak java.exe czy javac.exe.

Jeśli PATH zawiera kilka ścieżek do różnych katalogów bin JDK, Windows zawsze użyje pierwszej znalezionej. Jeśli dodatkowo JAVA_HOME wskazuje inne JDK niż to, które jest pierwsze w PATH, powstaje klasyczny konflikt. Jedna wersja jest używana do kompilacji, a inna do uruchamiania aplikacji.

Skutkiem są zagadkowe błędy, na przykład różnice w funkcjach dostępnych w danym języku, niemożność uruchomienia aplikacji skompilowanej dla wyższej wersji, czy komunikaty „unsupported major.minor version”. Rozwiązanie konfliktu polega więc na świadomym zarządzaniu tymi zmiennymi i oddzieleniu konfiguracji poszczególnych projektów.

Podstawy: jak edytować zmienne środowiskowe w Windows

Zanim przejdziesz do konkretnych metod przełączania między JDK 8 i JDK 17, warto opanować edytowanie zmiennych środowiskowych. To od nich zależy, jakiej wersji JDK używa system oraz narzędzia uruchamiane z wiersza poleceń.

Aby otworzyć ustawienia zmiennych środowiskowych w Windows:

  1. Naciśnij Win + R.
  2. Wpisz sysdm.cpl i zatwierdź klawiszem Enter.
  3. Przejdź do zakładki „Zaawansowane”.
  4. Kliknij przycisk „Zmienne środowiskowe…”.

W nowym oknie zobaczysz dwie sekcje:

  • „Zmienne użytkownika” – dotyczą tylko aktualnie zalogowanego użytkownika.
  • „Zmienne systemowe” – obowiązują dla wszystkich użytkowników w systemie.

Najczęściej:

  • Zmienną JAVA_HOME ustawiamy jako zmienną systemową.
  • Zmienną Path modyfikujemy zarówno w sekcji użytkownika, jak i systemowej, w zależności od potrzeb.

Pamiętaj, że kolejność wpisów w Path ma znaczenie – Windows przeszukuje ścieżki od góry do dołu. Jeśli chcesz, żeby zawsze używane było JDK wskazane przez JAVA_HOME, warto dodać wpis %JAVA_HOME%\bin jak najwyżej na liście. To podstawowy krok do opanowania konfliktu wersji JDK 8 i JDK 17.

Metoda 1: ręczne przełączanie JAVA_HOME – prosta, ale uciążliwa

Najprostszy sposób na rozwiązanie konfliktu wersji JDK 8 i JDK 17 w jednym systemie Windows to ręczna zmiana JAVA_HOME za każdym razem, gdy chcesz użyć innej wersji. To metoda dobra na początek, ale ma swoje ograniczenia i wymaga dyscypliny.

Podstawowe kroki są następujące:

  1. Zainstaluj obie wersje JDK w osobnych katalogach, np.:
  2. C:\Program Files\Java\jdk1.8.0_301
  3. C:\Program Files\Java\jdk-17
  4. Utwórz lub edytuj JAVA_HOME w „Zmiennych środowiskowych” i ustaw ją na jeden z katalogów, np.
    C:\Program Files\Java\jdk-17.
  5. Dodaj %JAVA_HOME%\bin do Path w sekcji „Zmienne systemowe” i umieść ten wpis wysoko na liście.
  6. Przełączanie wersji polega na zmianie wartości JAVA_HOME w tym samym oknie z:
    C:\Program Files\Java\jdk-17 na
    C:\Program Files\Java\jdk1.8.0_301 (lub odwrotnie).
  7. Po każdej zmianie otwieraj nowe okno terminala i sprawdzaj: cmd java -version javac -version

Zaletą tej metody jest prostota – wszystko odbywa się w jednym miejscu, bez dodatkowych narzędzi. Wadą jest natomiast to, że musisz pamiętać o zmianie za każdym razem. Łatwo otworzyć projekt wymagający JDK 8, podczas gdy system wciąż wskazuje JDK 17, i odwrotnie. Przy większej liczbie projektów metoda szybko robi się męcząca.

Mimo to warto ją znać, bo pozwala zrozumieć, jak JAVA_HOME i Path wpływają na wybór wersji JDK w systemie Windows. Jest też przydatna jako awaryjne rozwiązanie, gdy inne metody zawiodą.

Metoda 2: skrypty Batch/PowerShell – wygodne lokalne przełączanie JDK

Znacznie wygodniejszym sposobem na rozwiązanie konfliktu wersji JDK 8 i JDK 17 w Windows jest użycie skryptów Batch lub PowerShell, które ustawiają odpowiednią wersję JDK tylko w ramach bieżącej sesji terminala. Dzięki temu możesz mieć różne okna wiersza poleceń, każde z inną wersją JDK.

Utwórz katalog, np. C:\dev\java_switcher, i dodaj w nim dwa pliki .bat:

Plik set_jdk8.bat:

@echo off
set JAVA_HOME="C:\Program Files\Java\jdk1.8.0_301"
set PATH=%JAVA_HOME%\bin;%PATH%
echo JAVA_HOME ustawione na JDK 8: %JAVA_HOME%
java -version

Plik set_jdk17.bat:

@echo off
set JAVA_HOME="C:\Program Files\Java\jdk-17"
set PATH=%JAVA_HOME%\bin;%PATH%
echo JAVA_HOME ustawione na JDK 17: %JAVA_HOME%
java -version

Aby skorzystać z tych skryptów:

  1. Otwórz Wiersz poleceń (CMD) lub PowerShell.
  2. Przejdź do katalogu ze skryptami, np.: cmd cd C:\dev\java_switcher
  3. Uruchom odpowiedni skrypt:
  4. dla JDK 8: set_jdk8.bat
  5. dla JDK 17: set_jdk17.bat

Ustawienia JAVA_HOME i PATH zmieniają się tylko w obrębie aktualnego okna terminala. Dzięki temu możesz np. w jednym oknie pracować nad projektem w Javie 8, a w drugim nad projektem w Javie 17, bez ich wzajemnego zakłócania.

Jeśli używasz PowerShell, mechanizm jest podobny, ale zmienne ustawiasz tak:

$env:JAVA_HOME = "C:\Program Files\Java\jdk-17"
$env:Path = "$env:JAVA_HOME\bin;" + $env:Path
java -version

Taka metoda jest szybka, elastyczna i bardzo dobrze sprawdza się w codziennej pracy. Świetnie nadaje się do łączenia z konfiguracją w IDE, gdzie osobno definiujesz wersję JDK dla każdego projektu.

Schemat pokazujący dwa równoległe terminale Windows – jeden z JDK 8, drugi z JDK 17, ilustrujący przełączanie wersji JDK skryptami

Metoda 3: konfiguracja JDK w IDE – precyzyjna kontrola per projekt

Najbardziej profesjonalnym i praktycznym podejściem jest skonfigurowanie konkretnej wersji JDK dla każdego projektu bezpośrednio w IDE. Pozwala to uniknąć zależności od globalnych ustawień Windows i rozwiązuje konflikt JDK 8 i JDK 17 na poziomie projektu. Dobre IDE potrafią równocześnie pracować z wieloma wersjami JDK.

IntelliJ IDEA: JDK 8 i JDK 17 w jednym środowisku

W IntelliJ IDEA możesz dodać wiele SDK i przypisać je do projektów oraz modułów:

  1. Przejdź do File -> Project Structure (Ctrl+Alt+Shift+S).
  2. W sekcji Platform Settings -> SDKs dodaj oba JDK, wskazując katalogi instalacji.
  3. Nazwij je czytelnie, np. JDK 8 i JDK 17.
  4. W sekcji Project Settings -> Project wybierz Project SDK, np. JDK 17.
  5. W przypadku projektów wielomodułowych przejdź do Project Settings -> Modules -> Dependencies i ustaw Module SDK osobno dla każdego modułu.

Dzięki temu jeden projekt lub moduł może używać JDK 8, a inny JDK 17. IDE dba o to, aby do kompilacji i uruchamiania zawsze używać właściwej wersji, niezależnie od tego, co masz ustawione w JAVA_HOME.

Eclipse: przełączanie biblioteki JRE/JDK

W Eclipse zarządzanie wieloma JDK odbywa się na poziomie Installed JREs:

  1. Otwórz Window -> Preferences -> Java -> Installed JREs.
  2. Dodaj nowe wpisy dla JDK 8 i JDK 17, wskazując ich katalogi instalacyjne.
  3. Wybierz domyślny JRE/JDK, jeśli chcesz, aby nowo tworzone projekty go używały.
  4. Dla konkretnego projektu kliknij prawym przyciskiem na projekt, wybierz Properties.
  5. Przejdź do Java Build Path -> zakładka Libraries, usuń starą JRE System Library.
  6. Dodaj nową JRE System Library, wybierając odpowiednią wersję z listy Installed JREs.

W ten sposób każdy projekt może używać innego JDK, co rozwiązuje konflikt wersji bez ingerowania w globalne zmienne systemu Windows.

VS Code z Java Extension Pack: konfiguracja runtimes

W Visual Studio Code, przy użyciu Java Extension Pack, konfigurujesz dostępne JDK w pliku settings.json:

  1. Otwórz ustawienia (Ctrl+,) i wyszukaj java.configuration.runtimes.
  2. Dodaj coś w tym stylu: json "java.configuration.runtimes": [ { "name": "JavaSE-1.8", "path": "C:\\Program Files\\Java\\jdk1.8.0_301", "default": true }, { "name": "JavaSE-17", "path": "C:\\Program Files\\Java\\jdk-17" } ]
  3. VS Code potrafi wybrać odpowiednie JDK na podstawie konfiguracji projektu (pom.xml, build.gradle).
  4. Możesz też ręcznie zmienić runtime aktywnego projektu przez paletę komend (Ctrl+Shift+P) wpisując Java: Configure Java Runtime.

To podejście daje bardzo dużą swobodę – każdy projekt może mieć przypisaną własną wersję JDK, niezależnie od tego, co pokazuje java -version w wierszu poleceń.

Praktyczne wskazówki: weryfikacja, narzędzia budowania i izolacja

Aby skutecznie rozwiązać konflikt wersji JDK 8 i JDK 17 w jednym systemie Windows, nie wystarczy tylko zmienić JAVA_HOME. Trzeba także pamiętać o kilku praktycznych zasadach dotyczących weryfikacji i narzędzi budowania, takich jak Maven czy Gradle.

Po każdej zmianie JAVA_HOME, modyfikacji Path czy przełączeniu konfiguracji w IDE:

  • Zawsze sprawdzaj w nowym oknie terminala: cmd java -version javac -version
  • Upewnij się, że pokazana wersja odpowiada tej, której oczekujesz dla danego projektu.
  • Restartuj terminal i IDE, jeśli zmieniałeś zmienne środowiskowe – otwarte wcześniej procesy mogą nie widzieć nowych ustawień.

Jeżeli używasz Mavena, zadbaj o zgodność wersji w projekcie, np.:

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

W przypadku Gradle możesz skorzystać z konfiguracji toolchain:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

To sprawia, że narzędzia budowania również wiedzą, na jaką wersję Javy kompilować kod. Samo IDE może już być poprawnie ustawione, ale bez takiej konfiguracji Maven lub Gradle mogą nadal działać na innej wersji.

W bardziej złożonych sytuacjach, gdy potrzebujesz pełnej izolacji środowisk, możesz rozważyć użycie kontenerów Dockerowych. W każdym kontenerze określasz dokładną wersję JDK i wszystkie zależności. To jednak rozwiązanie bardziej zaawansowane i w codziennej pracy lokalnej zwykle wystarcza kombinacja skryptów i poprawnie skonfigurowanego IDE.

Podsumowanie: jak opanować wiele JDK w jednym Windowsie

Rozwiązanie konfliktu wersji JDK 8 i JDK 17 w jednym systemie Windows wymaga przede wszystkim świadomej pracy ze zmiennymi JAVA_HOME i PATH oraz dobrego wykorzystania możliwości IDE. Ręczne przełączanie zmiennych środowiskowych daje podstawy zrozumienia problemu, ale na dłuższą metę bywa męczące.

Bardziej wygodnym podejściem jest użycie skryptów Batch lub PowerShell, które lokalnie ustawiają wybraną wersję JDK dla danego okna terminala. Największy komfort pracy daje jednak konfiguracja JDK bezpośrednio w IDE, gdzie każdemu projektowi możesz przypisać dokładnie tę wersję Javy, której potrzebuje.

Łącząc te metody, zyskujesz pełną kontrolę nad środowiskiem:

  • systemowe JAVA_HOME i PATH masz uporządkowane,
  • w terminalach przełączasz się skryptami między JDK 8 i JDK 17,
  • w IDE konfigurujesz JDK indywidualnie per projekt.

Dzięki temu techniczne problemy z wersjami JDK przestają spędzać sen z powiek, a Ty możesz skupić się na tym, co najważniejsze – na nauce, kodowaniu i rozwijaniu swoich aplikacji w Javie 8 i Javie 17 równocześnie.

Marek Radoszewski

Autor

Marek Radoszewski

Freelance developer i tech blogger od 7 lat. Pracował przy projektach dla klientów z Polski, UK i USA. Na blogu pisze o praktycznych aspektach programowania, narzędziach i tym, jak skutecznie rozwijać karierę jako niezależny programista.

Wróć do kategorii Narzędzia i Praktyki