Java w VSCode

Java na szybko
Załóżmy, że potrzebujesz “na szybko” napisać jakiś program w Javie. Jakiego edytora użyjesz? Myślę, że większość Javowców, nawet jeśli są wyznania Vim-owego albo wyznawcami Kościoła Emacs, ucieknie się do uruchomienia grubego IDE takiego jak Eclipse, IntellijIdea lub - szczególnie ostatnimi laty - VSCode.
Przynam się, że ja też jakś czas temu zainstalowałam VSCode (zdaje się, że przy okazji nauki języka Go). Wciąż się docieramy (ja i VSCode) - mimo możliwości “podpięcia” sktótów klawiszowych z innych IDE wciąż staram się nauczyć sktótów właściwych dla VSCode i zrozumieć “filozofię” tego edytora.
Tym razem postanowiłam sprawdzić, jak zachowuje się VSCode podczas rozwijania projektu w Javie.
Instalacja rozszerzeń
Instrukcje instalacji rozszerzeń obsługujących język Java są podane w artykule pomocy dla języka Java na stronie vscode i w zasadzie tłumaczą wszystko. Spróbuję więc stworzyć prostą aplikację w Javie używając systemu budowania Maven.
Podstwowy zbiór rozszerzeń
Na początku trzeba zacząć od podstawowego zbioru rozszerzeń ze sprwdzonego źródła, dzięki króremu będzie możliwe wygodne (tj. z kolorkami i podpowiedziami) pisanie kodu w Javie.

Zainstalowałam więc pakiet “Java Extension Pack”. Otrzymuję:
- wsparcie dla języka (linting, formatowanie) od RedHat
- debugger od Microsoft
Tworzenie nowego projektu
Projekt mavenowy
Magiczny skrót Ctrl-Shift-P otwiera command palette (paletę poleceń), w której wpisuję i wybieram “create new maven project”:

Wybieram:
- nazwę archetypu (wybrałam pierwszą- maven-archetype-quickstart) i jego wersję
- podaję groupId oraz artifactId
W terminalu widzę, że w tle ściągają się zależności potrzebne do zbutowania projektu. Potwierdzam wersję mojego projektu (1.0-SNAPSHOT) i już.
Inne typy projetu
Mogę utworzyć wiele różnych typoów projektów, nie tylko projekt mavenowy:

Te inne typy projektów spróbuję utworzyć później. Na razie spróbujmy uruchomić domyśnie wygenerowany (na podstawie archetypu) test.
Uruchomienie domyślnego testu
Pierwszy problem:
Uruchomienie z “command palette”
“Java: run tests” z command palette wyświetla błąd:

Uruchomienie z “java projects”
Error running command java.test.runFromJavaProjectExplorer: command ‘java.test.runFromJavaProjectExplorer’ not found. This is likely caused by the extension that contributes java.test.runFromJavaProjectExplorer.

Uruchomienie z widoku mavena
Dopiero gdy wchodzę do widoku mavena i uruchamiam bezpośrednio fazę “test”, projekt się buduje i uruchamia testy.

Uwaga: błąd, który otrzymywałam próbując uruchomić testy z widoku “Java Projects” zniknął samoistnie po ponownym otworzeniu projektu.
Tworzenie aplikacji SpringBoot
Zaintrygowała mnie możliwość stworzenia aplikacji SpringBoot z VSCode, więc postanowiłam spróbować:
Uwaga: uruchamianie serwera językowego dla Javy - polegające chyba na przeskanowaniu wszystkich jarów na classpath - może trwać bardzo długo.
Po zainstalowaniu rozszerzenia “Spring Initializr Java Support” można z poziomu VSCode wybrać potrzebne startery:
Później, gdy okaże się, że czegoś jeszcze brakuje, moża listę starterów wygodnie poszerzyć, wybierając z palety opcję Spring Initializer: Add starters...
.
Rozwijanie aplikacji
Kiedy aplikacja już została utworzona, warto zapoznać się z kolejnym rozszerzeniem: “Spring Boot Tools”:
Uwaga: po zainstalowaniu dodatku warto ponownie otworzyć projekt(y), aby umożliwić poprawne ich przeskanowanie i zebranie potrzebnych informacji. Niestety,nie dzieje sie to automatycznie dla już otwartych projektów.
Większe możliwości pracy ze Springiem
Po jego zainstalowaniu pojawiają się interesujące możliwości:
- właściwości aplikacji w application.properties (lub application.yaml): sprawdzanie poprawności, podpowiadanie wartości (uzupełnianie kodu)
- informacje o aktualnie uruchomionej aplikacji (PID procesu, po najechaniu na deklarację wstrzykniętego beana: klasa i nazwa beana w czasie wykonania)
- nawigacja po dostępnych endpointach w aplikacji (skrót: Ctrl-T):
@/
pojazuje zdefiniowane mapowania żądań REST (ścieżka, metoda, plik źródłowy)@+
pokazuje zdefiniowane beany springowe (nazwa, typ, plik źródłowy)@>
pokazuje funkcje@
pokazuje adnotacje springowe w kodzie
- możliwość łatwego uruchamiania i zatrzymywania aplikacji
Na przykład:
Alternatywa: jeden plugin to rule them all
Obydwa rozszerzenia można zainstalować za jednym zamachem: wystarczy odszukać rozszerzenia “Spring Boot Extension Pack”, który zawiera (opakowuje) dwa wspomniane wyżej:
Uruchamianie aplikacji
Nezawodnym sposobem uruchomienia aplikajci spring-boot - i według mnie najwygodniejszym -jest zrobienie tego z poziomu wiersza poleceń. Po wpisaniu mvn spring-boot:run
uruchamiana jest aplikacja z logami Springa wypisywanymi (domyślnie) na wyście standardowe terminala.
Jeśli jest zainstalowany powyższy dodatek, można wykorzystać widok “Spring Boot Dashboard”, dzięki któremu łatwiej “zarządzać” uruchomieniami aplikacji:
Testowanie
Wszystkie testy uruchamiają się z widoku testowania bez zarzutu. Można uruchamiać je pojedynczo bądź w całości (nawet dla wielu projektów na raz, jeśli są częścią workspace-a):
Ukryte smaczki
Warto pamiętać o tym, że dużo przydatnych opcji jest w VSCode schowanych w menu kontekstowym. Warto zatem sięgnąć po myszkę i poklikać jej prawy przycisk w różnych kontekstach.
W kodzie źródłowym Javy pojawiają się tam dwie ciekawe pozycje:
- refactor (skrót: Shift-Ctrl-T
- Code Action (domyślnie bez skrótu)
Pierwsza posiada zbiór dostępnych refaktoryzacji; druga pozwala na wygenerowanie testów, konstruktorów, implementacji equals/hashCode itp.
Podsumowanie
Na pierwszy rzut oka da się dość szybko uzyskać funkcjonalne środowisko do programowania w Javie. Warunkiem powodzenia jest oczywiście zaistalowanie dodatków: RedHat, Pivotal i Microsoft (a także twórcy wielorakch pluginów) zrobili kawał dobrej roboty.
Na pewno jest to niezła altrnatywa dla tych, którzy nie mogą sobie pozowlić na zakup licencji na wersję Ultimate IntellijIdea, a tworzą projekty webowe, w szczególności w Spring Boot.
Jak to zwykle w takich sytuacjach bywa, nowe IDE oznacza natychmiastowy spadek efektywności pracy z kodem do czasu, aż człowiek:
- nauczy się nowych skrótów klawiszowych
- dowie się, jak działają pewne specyficzne dla danego IDE procesy: taski, makra, preferencje, workspace-y
- wbuduje w pamięć mięśniową sposoby wykonywania pewnych zadań takich , jak: refaktoryzacja, przełączanie się między kodem a testem, zwijanie/rozwijanie (folding/unfolding)
- poczyta o swoim nowym IDE w oficjalnej dokumentacji