PRA01.rst

Programming Laboratory

Środowisko develperskie

Uwaga! Kod z którego będziemy korzystać na zajęciach jest dostępny na branchu IntroductionClassesStart w repozytorium https://github.com/WitMar/PRA2021-PRA2022 . Kod końcowy można znaleźć na branchu IntroductionClassesEnd.

Edytor

Implementując programy w języku Java, rekomendowanym (i aktualnie jednym z najpopularniejszych) IDE jest IntelliJ IDEA dostępny za darmo w wersji Community (link poniżej) (jako studenci możecie Państwo prosić o darmowy dostęp do wersji Ultimate - https://www.jetbrains.com/community/education/#students):

GIT

GIT to system kontroli wersji oprogramowania.

Git posiada trzy stany, w których mogą znajdować się pliki: zatwierdzony, zmodyfikowany i śledzony. Zatwierdzony oznacza, że dane zostały bezpiecznie zachowane w Twojej lokalnej bazie danych. Zmodyfikowany oznacza, że plik został zmieniony, ale zmiany nie zostały wprowadzone do bazy danych. Śledzony - oznacza, że zmodyfikowany plik został przeznaczony do zatwierdzenia w bieżącej postaci w następnej operacji commit.

Podstawowy sposób pracy z Git wygląda mniej więcej tak:

* Dokonujesz modyfikacji plików w katalogu roboczym.

* Oznaczasz zmodyfikowane pliki jako śledzone, dodając ich bieżący stan (migawkę) do przechowalni.

* Dokonujesz zatwierdzenia (commit), podczas którego zawartość plików z przechowalni zapisywana jest jako migawka projektu w katalogu Git.

GIT FLOW:

a10

Zadanie 1

Załóż konto na GitHub

Otwórz repozytorium

Wybierz Fork by ściągnąć repozytorium na własne konto (W ten sposób na koniec zajęć będziesz mógł przesłać kod do własnego repozytorium).

Otwórz Idea intellij na komputerze.

W przypadku, gdy uruchamiasz edytor poraz pierwszy zobaczysz wyskakujące okno i wybierz z niego Project from version control, w przypadku, gdy nie jest to Twoje pierwsze uruchomienie wejdź na File-> New -> Project From Version Control -> Git.

Skopiuj w pokazującym się nowym oknie adres dostępny po wybraniu na stronie GitHub opcji CloneOrDownload (uwaga wybierz adres z opcja HTTPS, adres w opcji SSH nie zadziała!!).

1

Domyślnie po uruchomieniu znajdujesz się na branchu master, który u nas jest pusty. Wybierz w prawym dolnym rogu aplikacji nazwę brancha i przenieś się na branch IntroductionClassesStart.

a2

Powinieneś uzyskać następujący efekt - z dokładnością do nazwy klasy. Uwaga jeśli kod nie jest pokolorowany tak jak oczekujesz znaczy to, że środowisko nie rozpoznało automatycznie twojego pliku Mavena:

Wybierz ikonkę lupki i wpisz maven, wybierz opcję Add Maven Project.

aMV

Następnie znajdź katalog do którego ściągnąłeś kod i wybierz plik pom.xml. Powinieneś otrzymać poniższy wynik (spójrz na ikonki przy plikach!). Z prawej strony ekranu pojawiła się zakładka Maven, wybierz w niej opcję COMPILE i uruchom (zielony trójkąt w zakładce lub kliknij dwa razy napis compile).

a3

Jeżeli nadal kod nie jest dobrze pokolorowany wejdź w opcje File -> Project Structure, ustaw wersje Javy na 11 w zakładce Project oraz składni w zakładce Module też na java 11.

a33

Sprawdź wersje kompilatora używanego przez IDE File -> settings -> compiler, też wybierz wersję Java 11.

a113

MAVEN

Maven to system budowania aplikacji, który pomaga nam zautomatyzować proces kompilacji i generowania plików uruchomieniowych jar-ów, war-ów itp. Narzuca on specyficzną strukturę projektu.

* pom.xml – główny plik konfiguracji Maven

* /src/main – katalog, gdzie znajdziemy pliki naszego programu, są tam dwa podkatalogi: java – tutaj trafiają wszystkie klasy (cały kod naszego modułu)

* resources – tutaj będą wszystkie pliki, które nie są kodem, np. grafiki, pliki XML, konfiguracje w przypadku projektów webowych będziemy mieli także katalog webapp, który jest używany do umieszczania wszystkich treści webowych

* /src/test - ma podobną strukturę jak katalog main z tą różnicą, że jest on wykorzystywany tylko w trakcie automatycznych testów

* /target – tutaj trafia skompilowany projekt (czyli np. w postaci wykonywalnego pliku JAR lub aplikacji webowej WAR)

W prawym górnym rogu znajdziemy zakładkę "Maven". Jeżeli nie masz takiej zakładki włączysz ją poprzez wybranie View -> Tool Windows -> Maven Projects.

Po rozwinięciu powinniśmy widzieć listę instrukcji (jeżeli nie wybieramy odśwież - dwie zielone strzałki, jak nie pomoże klikamy plusik i wskazujemy na plik pom.xml w naszym projekcie i ok).

Zadanie 2

Wykonaj w zakładce Mavena Clean + Install, powinieneś otrzymać komunikat BUILD SUCCESS

a22

Po tym etapie plik Main.java powinien mieć obok nazwy klasy zielone kółeczko z "c" w środku, jeżeli tak nie jest najlepiej powtórz wszystkie operacje od początku.

Więcej o Mavenie można znaleźć np tutaj:

Maven dokumentacja:

Tworzenie pliku Jar w Maven:

Zadanie 3

Spróbuj uruchomić klasę Main.java (pracy klik myszki i wybór opcji Run). Wykonaj to samo na pliku z rozszerzeniem .jar z katalogu o nazwie target. Zobacz jaki będzie efekt (naprawimy to za moment).

Logger

Bardzo ważnym i pomocnym elementem projektu informatycznego jest logowanie komunikatów / błędów. Szczególnie użyteczne są możliwości dzielenia logów na poziomy, zapisywanie automatyczne do pliku, a także możliwość analizy aplikacji wielowątkowych. Przykładem biblioteki do logowania jest log4j.

Aby używać w naszym projekcie biblioteki log4j dodajmy do naszego projektu (do pliku mavena pom.xml) zależność do biblioteki logowania log4j wklejając tam: .. class:: highlight

<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

W ogólności jeżeli chcemy dodać bibliotekę log4j do projektu, aby znaleźć odpowiedni wpis wystarczy w google wpisać maven log4j. Pierwszy link powinien zaprowadzić nas na stronę:

Po wyborze wersji zobaczymy wpis:

Uwaga! Za pierwszym razem dodaliśmy tag dependencies w przyszłości będziemy tylko wklejać odpowiednie dependencje pomiędzy ten tag.

Odśwież zakładkę Mavena powieneś widzieć na niej nową kategorię o nazwie Dependencies a w niej jeden wpis na temat log4j.

Teraz dodamy do klasy Main.java wywołanie loggera. Dodaj do klasy zmienną globalną:

Logger log = Logger.getLogger("name");

Uwaga! Dodając nowy obiekt zwróć uwagę, że korzystać z biblioteki log4j, gdyż w Javie jest wiele bibliotek o nazwie Logger, i wykorzystanie innej nie zadziała tak jak chcemy. Innymi słowy spójrz czy w powstałym imporcie w nazwie klasy jest log4j.

Dodaj w metodzie main() wywołanie:

log.info("message");

Zadanie 4

Uruchom klasę Main.java zobacz czy widzisz wiadomość "message".

Log4j

Powód dla którego nie widzisz wiadomości jest to, że nie zdefiniowaliśmy ustawień loggera, w związku z czym informacje na nim zapisywane nie są nigdzie przekazywane.

Aby stworzyć pliku ustawień musimy utworzyć w katalogu Resources plik o nazwie log4j.properties;

Wklej do pliku następujące ustawienia:

# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Ustawienia mówią o tym by wszystkie logi o statusie ponad DEBUG były wypisywane na ekran i zapisywane w pliku log.log.

Więcej informacji o log4j można doczytać tutaj:

Zadanie 5

Uruchom klasę Main.java, powinieneś zobaczyć na ekranie komunikat "message". W katalogu projektu powinnien też zostać stworzony plik o nazwie log.log.

JAR

JAR jest skompilowanym uruchamialnym plikiem javy. Możesz go uruchomić z IDE lub z konsoli wpisując komendę java -jar filename.

Żeby JAR się uruchomił musi mieć zdefiniowaną ścieżkę do klasy uruchomieniowej (tzw. manifest).

Dodaj do pliku pom.xml (Mavena) następujący kod:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <finalName>${project.artifactId}-${project.version}</finalName>
                        <attach>false</attach>
                        <appendAssemblyId>false</appendAssemblyId>
                        <archive>
                            <manifest>
                                <mainClass>
                                    introduction.HelloWorld
                                </mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Main class jest ścieżką do uruchamianej klasy.

Zadanie 6

Zkompiluj projekt używając Clean + Install w Maven i uruchom plik .jar z katalogu target, powinien zadziałać.

Commit

Zadanie 7

Zakommituj swój kod do repozytorium pod nowy branch o nazwie IntroductionClassesWithLogger.

Commit w IntelliJ

Ctrl + k służy do commitowania kodu lokalnie do repozytorium

Ctrl + Shift + k służy do commitowania kodu do zewnętrznego repozytorium, aby wybrać nową nazwę brancha kliknij na nazwę brancha w okienku komitowania.

Ctrl + t służy do odświeżania projektu - ściągania zmian z serwera

Przy pierwszym połączeniu powinniśmy być zapytani o użytkownika i hasło. Można też połączyć "na stałe" intellij z kontem na github przez ustawienia Settings->Version Control->GitHub.

Inne:

By rozwiązać konflikty należy zmergować się z kodem do którego commitujemy i rozwiązać konflikty w nowo otwartym oknie.

Aby ściągnąć kod danego commita do siebie bez merga możemy wykonać operację Cherry Pick

Finalny kod

W przypadku problemów (zgubiłeś się lub byłeś nieobecny) finalny kod powstały na zajęciach możesz znaleźć na gałęzi IntroductionClassesEnd.