Pierwsze Kroki z darmową Wirtualną Maszyną

Przegląd darmowej Wirtualnej Maszyny dla Programisty Java. Zapoznanie z narzędziami developerskimi, które są na niej zainstalowane oraz "Hello World"

Pierwsze Kroki z darmową Wirtualną Maszyną

Wstęp

Jeżeli jeszcze nie posiadasz darmowej Wirtualnej Maszyny dla Programisty Java, wciąż możesz ją pobrać tutaj.

W tym poście skupię się na przedstawieniu narzędzi developerskich, które zostały na niej zainstalowane i oddane w Twoje ręce.

Aplikacje na pulpicie

Po uruchomieniu Wirtualki naszym oczom ukaże się poniższy widok:

Aplikacje na pulpicie Wirtualnej Maszyny

Najważniejsze aplikacje zainstalowane na Ubuntu znajdują się na pulpicie:

  • GEdit - domyślny edytor tekstu systemu operacyjnego Ubuntu
  • Katalog Domowy - eksplorator plików otwierający się w Katalogu Domowym
  • Wykorzystanie dysku - nazwa mówi wszystko. Przydatne do ustalania co zjada nam miejsce na dysku
  • Monitor Systemu - wyświetla procesy oraz zużycie procesora/pamięci RAM
  • Terminator - terminal, który w bardzo prosty sposób można podzielić na wiele okien
  • InteliJ IDEA Community - darmowe, zintegrowane środowisko developerskie (ang. Integrated Development Environment, w skrócie IDE) służące do wytwarzania oprogramowania w języku Java
  • Mozilla Firefox - popularna przeglądarka internetowa, wersja dla developera
  • Chromium - druga, równie popularna przeglądarka internetowa: Google Chrome w wersji open source
  • Postman - narzędzie do budowania i używania interfejsu programowania aplikacji (Application Programming Interface, w skrócie API)
  • Apt Update Indicator - pokazuje dostępne aktualizacje systemu i umożliwia ich zainstalowanie
  • Force Quit - przycisk uruchamiający komendę xkill umożliwiający szybkie zamknięcie wybranego okna. Używany kiedy nie możemy zamknąć okna w inny sposób (np. w przypadku, gdy się ono zawiesi)

System operacyjny Ubuntu

Katalog Domowy to miejsce, w którym przechowywane są wszystkie pliki (w tym konfiguracja) na użytek naszego użytkownika javowiec.

Pliki i foldery w Katalogu Domowym użytkownika javowiec

Foldery i pliki z . na początku są domyślnie ukryte (niewidoczne) na Ubuntu. Na Wirtualce zmieniłem te ustawienie by można było je zobaczyć. Najważniejsze foldery i pliki to:

  • projects - miejsce do przechowywania projektów developerskich, nad którymi pracujesz
  • .javowiec-vm - w tym folderze znajdują się cztery pliki:
    • .version - plik z wersją Wirtualnej Maszyny
    • versions.sh - skrypt, który wypisuje w terminalu wersję Wirtualki oraz wersje zainstalowanych na niej narzędzi developerskich. Można go odpalić w terminalu aliasem versions
    • cleanVm.sh - czyści Wirtualkę ze zbędnych plików. Można go odpalić w terminalu aliasem cleanVm
    • shrinkVm.sh - kurczy Wirtualkę, gdy zajmuje za dużo miejsca na dysku twardym. Można go odpalić w terminalu aliasem shrinkVm. Dobrze jest przed tym uruchomić alias cleanVm
  • .m2 - tutaj przechowywane są ustawienia Mavena (plik settings.xml) oraz repozytorium artefaktów (folder repository), który warto czyścić, gdy urośnie do sporych rozmiarów
  • .bash_aliases - aliasy dla komend.

Polecam szczególnie zapoznać się z plikiem .bash_aliases. Umieściłem w nim przydatne i wygodne aliasy dla wielu dłuższych komend. Najważniejsze aliasy, które powinieneś poznać:

  • alias d="docker" - pozwala używać aliasu d zamiast komendy docker
  • alias dcp="docker-compose" - pozwala używać aliasu dcp zamiast komendy docker-compose
  • alias k="kubectl" - pozwala używać aliasu k zamiast komendy kubectl
  • alias m="minikube" - pozwala używać aliasu m zamiast komendy minikube
  • alias fixInternet="sudo systemctl restart NetworkManager" - w razie problemu z brakiem Internetu na Wirtualce, odpal polecenie fixInternet w terminalu
  • alias fixDocker="sudo systemctl restart NetworkManager docker" - w razie problemu z Dockerem lub Kubernetesem, odpal polecenie fixDocker w terminalu
  • alias versions="~/.javowiec-vm/versions.sh" - wyświetla wersję Wirtualki oraz wersje zainstalowanych na niej narzędzi developerskich

Co ważne, aliasy dla docker, docker-compose, kubectl i minikube działają wraz z funkcją bash-completion, czyli uzupełnianiem komend po wciśnięciu klawisza TAB w terminalu. Komendy te są zawsze używane przy wykonywaniu konkretnych działań w danej technologii. Skrócenie ich oszczędza czas.

Przykład użycia aliasu versions w terminalu Wirtualnej Maszyny w wersji 21.11.1

Terminal Terminator

Terminator to terminal, który można podzielić na wiele okien w bardzo prosty sposób. Wystarczy kliknąć prawym przyciskiem myszy w terminalu i wybrać odpowiednią opcję z menu kontekstowego! Innym sposobem są skróty klawiszowe (sprawdź dokumentację). Co więcej, rozmiar podzielonych okienek można dowolnie zmieniać.

Menu kontekstowe w terminalu Terminator

Zapytasz do czego to się przydaje? Już odpowiadam. Załóżmy, że potrzebujesz wykonać jakąś akcję i równocześnie mieć podgląd na to, co dzieje się po jej wykonaniu. Problem ten może rozwiązać podział na dwa okienka w Terminatorze.

Podział okienka Terminatora: u góry na żywo obserwujemy jak tworzy się Pod, na dole tworzymy Deployment
Podział okienka Terminatora: u góry na żywo obserwujemy logi Poda, na dole tworzymy Deployment

Docker, Docker Compose i Ctop

Docker dostarcza możliwość pakowania i uruchamiania aplikacji w izolowanym środowisku, którym jest kontener (ang. container). Kontenerem nazywamy uruchomiony proces (program), który działa w odizolowanym środowisku posiadającym wszystkie zależności. Zależności te są potrzebne do prawidłowego działania procesu.

Możemy zatem spróbować uruchomić nasz pierwszy kontener o nazwie hello-world z obrazu (ang. image) o tej samej nazwie. Mała uwaga: kontenery są tworzone z obrazów. Zrobimy to poniższym poleceniem w terminalu:

docker container run --name hello-world hello-world
Wiadomość "Hello World" z kontenera Dockera

Czym jest "Hello World" w programowaniu? "Hello World" w dosłownym tłumaczeniu to oczywiście "Witaj Świecie". Gdy programista uczy się jakiejś technologii, zazwyczaj pierwszym jego zadaniem jest wypisanie napisu "Hello World" (bądź innego dowolnego) przy jej użyciu. W ten sposób "witasz" się z nią i możesz zacząć zgłębiać dalsze jej techniki 😀

Ctop to graficzne narzędzie pozwalające obserwować kontenery oraz wykonywać na nich poszczególne akcje. Jak go uruchomić? Wystarczy wpisać w terminalu komendę: ctop.

Okienko Ctop w terminalu

Zauważysz, że kontener jest oznaczony czerwoną kropką. Oznacza to, że nie jest uruchomiony: zakończył on swoje działanie, którym było wypisanie wiadomości "Hello World". Aby usunąć kontener z poziomu Ctop, kliknijmy klawisz Enter, a następnie z menu kontekstowego wybierzmy [R] remove lub kliknijmy Shift + R. Następnie potwierdźmy akcję i wyjdźmy z Ctop kombinacją klawiszy Ctrl + C.

Menu kontekstowe Ctop

Docker Compose to narzędzie pozwalające na uruchomienie wielu kontenerów jednym poleceniem.

Stwórzmy plik docker-compose.yml pod ścieżką ~/projects/docker-compose-hello-world/ (gdzie ~ to skrót do Katalogu Domowego użytkownika javowiec) poniższym poleceniem:

mkdir ~/projects/docker-compose-hello-world/ && gedit ~/projects/docker-compose-hello-world/docker-compose.yml

Wklejmy do pliku docker-compose.yml poniższą zawartość:

version: "3.8"
services:
    hello-world-first:
        image: hello-world
    hello-world-second:
        image: hello-world

Następnie przejdźmy w terminalu do katalogu z plikiem docker-compose.yml i stwórzmy obydwa kontenery:

cd ~/projects/docker-compose-hello-world/
docker-compose up
Jedno polecenie Docker Compose i dwa kontenery wypisujące wiadomość "Hello World"

Aby usunąć kontenery stworzone w poprzednim kroku przez Docker Compose, wystarczy wpisać poniższą komendę:

docker-compose down

Kubernetes, Minikube i K9s

Kubernetes to popularne narzędzie do zarządzania kontenerami. Zarządcę takich kontenerów możemy inaczej nazwać Orkiestratorem Kontenerów (ang. Container Orchestrator). Kubernetes potrafi sprawić, że wiele serwerów, na których uruchomione są kontenery, działa jakby były jednym dużym serwerem. Serwer składający się z wielu serwerów nazywamy klastrem (ang. cluster) i właśnie zarządzanie takim klastrem ułatwia Kubernetes.

Minikube to narzędzie, które potrafi szybko stworzyć lokalny klaster Kubernetes na Linuxie, Windowsie czy macOS. Dzięki temu nie musimy posiadać wielu serwerów, by korzystać z Kubernetesa. Wystarczy do tego Wirtualna Maszyna na naszym lokalnym komputerze.

Lokalny klaster tworzymy poniższym poleceniem i czekamy cierpliwie aż się poprawnie zakończy:

minikube start
Prawidłowy start Minikube

Po utworzeniu klastra komenda Kubernetesa: kubectl (czyt. kube control) będzie skonfigurowana do współpracy z klastrem o nazwie minikube. Warto wspomnieć, że komenda kubectl umożliwia zarządzanie klastrem. Stwórzmy zatem nasz pierwszy Pod hello-world, z kontenerem tworzonym także z obrazu o tej samej nazwie, a następnie sprawdźmy logi:

kubectl run hello-world --image hello-world --restart Never
kubectl logs hello-world
Wiadomość "Hello World" z Poda Kubernetesa, na którym został uruchomiony kontener Dockera

K9s to graficzne narzędzie pozwalające obserwować klaster oraz wykonywać w nim poszczególne akcje. Aby go uruchomić, wystarczy wpisać w terminalu komendę k9s.

Okienko K9s w terminalu

Po otwarciu w okienku na liście zobaczymy naszego Poda. Po pierwszym kliknięciu Enter zobaczymy kontener będący w tym Podzie. Natomiast po drugim kliknięciu Enter zobaczymy logi kontenera hello-world sprzed minuty. Aby wyświetlić wszystkie logi kliknij 0.

Wiadomość "Hello World" z Poda Kubernetesa widoczna w narzędziu K9s

Kliknijmy zatem dwa razy klawisz Esc, aby wrócić do widoku Poda. Następnie użyjmy skrótu Ctrl + D, aby go usunąć. Potwierdźmy akcję i wyjdźmy z K9s kombinacją klawiszy Ctrl + C.

Usunięcie Poda w K9s

Na koniec pozostaje nam jedynie usunąć lokalny klaster poleceniem:

minikube delete

Java, Maven i InteliJ IDEA Community

Java to jeden z najpopularniejszych języków programowania. Maven to narzędzie do zarządzania i automatyzacji projektów. Z kolei InteliJ IDEA Community to darmowe, zintegrowane środowisko developerskie służące do wytwarzania oprogramowania w języku Java.

Napiszmy zatem prosty program w języku Java, który wypisuje wiadomość "Hello World" w konsoli. Otwórzmy InteliJ IDEA klikając w ikonę na pulpicie i wybierzmy opcję New Project, aby stworzyć nowy projekt.

Okno powitalne InteliJ IDEA Community. Tworzenie nowego projektu

Następnie w oknie tworzenia nowego projektu powinien być zaznaczony Maven oraz Java 11 jako Project SDK.

Tworzenie nowego projektu. Wybór technologii Maven i wersji Javy

Po kliknięciu Next wybierzmy lokalizację naszego projektu na dysku twardym przy pomocy przycisku z ikoną folderu: ~/projects/hello-world (musisz stworzyć nowy folder hello-world). Nazwą projektu powinien być hello-world. Teraz rozwińmy Artifact Coordinates przyciskiem z ikoną trójkąta i zmieńmy GroupId na pl.javowiec. Wartość ArtifactId powinna już być automatycznie ustawiona na hello-world. Kliknijmy Finish, aby utworzyć nowy projekt.

Tworzenie nowego projektu. Wybór nazwy projektu, jego lokalizacji na dysku twardym oraz koordynatów artefaktu używanych przez Mavena

Z poziomu InteliJ IDEA tworzymy klasę o nazwie HelloWorld.java poprzez rozwinięcie hierarchii hello-world/src/main/java, kliknięcie prawym przyciskiem myszy na folderze java i z menu kontekstowego wybranie New -> Java Class.

Menu kontekstowe umożliwiające stworzenie nowej klasy Java

W okienku tworzenia klasy wpisujemy pl.javowiec.HelloWorld, gdzie pl.javowiec to pakiet, zaś HelloWorld to nazwa klasy. Upewniamy się, że zaznaczona jest opcja Class i klikamy Enter.

Okienko tworzenia nowej klasy Java

W kolejnym kroku umieśćmy w klasie HelloWorld główną metodę o nazwie main, która po wykonaniu wypisze w konsoli wiadomość "Hello World":

public static void main(String[] args) {
    System.out.println("Witaj Świecie! Javowiec.pl wita nowego Javowca :)");
}
Główna metoda main, która wypisze wiadomość "Hello World"

Spróbujmy uruchomić teraz program skrótem klawiszowym Ctrl + Shift + F10 mając zaznaczoną klasę HelloWorld. Może się zdarzyć, żę program się nie uruchomi i wyświetli się komunikat błędu: Error: java: error: release version 5 not supported.

Błąd ten sygnalizuje, że Maven chciał skompilować nasz kod starszą Javą w wersji 5. Jeżeli nie ustawimy właściwości maven.compiler.source i maven.compiler.target, zostaną użyte domyślne wartości:

  • 1.5 (czyli Java 5)
  • lub 1.6 (Java 6), jeżeli maven-compiler-plugin jest w wersji 3.8.0 lub wyższej (MCOMPILER-335)

Plik pom.xml to plik XML, który posiada informacje i konfiguracje projektu używaną przez Mavena do budowania projektu. W projekcie używamy Javy 11, więc w pom.xml powinna być obecna poniższa deklaracja właściwości. Poinstruuje to Mavena jakiej wersji Javy ma używać do kompilowania i uruchamiania naszego programu:

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>
Poinstruowanie Mavena by kompilował (maven.compiler.source) i uruchamiał (maven.compiler.target) program wykorzystując Javę 11

Po wprowadzonych zmianach w pom.xml należy kliknąć poniższą ikonkę, aby je wczytać. Aby ponownie uruchomić program użyj skrótu Shift + F10 i sprawdź konsolę.

Dzięki tej opcji Maven zauważy zmiany w pliku pom.xml
Wiadomość "Hello World" wypisana z programu napisanego w Javie 11

Git

Git to system kontroli wersji, zaś Git LFS to jego rozszerzenie dla plików o dużym rozmiarze. Dzięki temu rozwiązaniu możemy m.in. śledzić zmiany w plikach czy cofać się do poprzedniej wersji plików. Umożliwia również klonowanie (ściąganie na nasz dysk twardy) innych repozytoriów kodu (projektów) np. z bardzo popularnego serwisu GitHub. Przykład komendy klonowania repozytorium kodu poniżej:

git clone https://github.com/nazwa-uzytkownika/nazwa-repozytorium-kodu.git

SdkMan

SdkMan to narzędzie pozwalające na szybką instalację takich technologii jak Java czy Maven (pełną listę można sprawdzić tutaj).

Wersje dostępne do zainstalowania możemy przeglądać poleceniem sdk list [technologia] np. sdk list java dla Javy lub sdk list maven dla Mavena. Instalacja odbywa się poleceniem sdk install [technologia] [wersja]. Możemy przełączać się pomiędzy poszczególnymi wersjami poleceniem sdk use [technologia] [wersja] w aktualnie otwartej sesji terminala lub sdk default [technologia] [wersja] we wszystkich sesjach terminala na stałe. Aby daną wersję technologii odinstalować, wystarczy użyć sdk uninstall [technologia] [wersja] Zainstalowane technologie można znaleźć pod ścieżką /opt/sdkman/candidates.

Zajrzyj do pełnej dokumentacji po więcej informacji. Używanie SdkMana jest łatwe, szybkie i przyjemne.

Fragment listy dostępnych wersji Javy do zainstalowania w SdkMan
Instalacja Javy 16.0.2-zulu oraz demonstracja szybkiej zmiany używanej wersji

Podsumowanie

Omówiony został pulpit Wirtualnej Maszyny oraz pliki i foldery, na które powinieneś zwrócić uwagę podczas zapoznawania się z nią. W szczególności polecam przejrzeć aliasy, które są pomocne w trakcie pracy na Wirtualce. Przedstawiłem terminal Terminator, który w prosty sposób umożliwia podział głównego okna na wiele podokienek.

Zapoznaliśmy się z technologią Dockera, w tym z Docker Compose oraz pomocnym, graficznym narzędziem Ctop. W podobny sposób zapoznaliśmy się z technologią Kubernetes, w tym z Minikube oraz kolejnym, graficznym narzędziem K9s. Zarówno przy użyciu Dockera jak i Kubernetes udało nam się wypisać wiadomość "Hello World" w konsoli.

Stworzyliśmy także wspólnymi siłami nasz pierwszy program w języku programowania Java z pomocą narzędzia do zarządzania i automatyzacji projektów Maven oraz darmowego, zintegrowanego środowiska developerskiego InteliJ IDEA Community. Wyjaśniłem również krótko czym jest system kontroli wersji Git oraz jego rozszerzenie Git LFS.

Więcej szczegółów dotyczących tych oraz innych technologii, które są przydatne w pracy na stanowisku Programisty Java otrzymasz w kolejnych postach! Gorąco zachęcam do zaglądania na Javowiec.pl i obserwowania profili społecznościowych 🙂

Liczba komentarzy:

Zaloguj się lub dołącz do społeczności Javowców, aby móc uczestniczyć w dyskusji 🙂