BUDOWANIE APLIKACJI Waldemar Korłub Platformy Technologiczne KASK ETI Politechnika Gdańska
Budowanie aplikacji 2 *.java resources punkt wejścia javac *.class *.properties *.css *.fxml *.png MANIFEST.MF Manifest-Version: 1.0 Built-By: stawrul Build-Jdk: 1.8.0_102 Main-Class: net.stawrul.app Class-Path: lib/log4j.jar biblioteki/ zależności jar (zip) app.jar biblioteki oraz ich zależności log4j.jar lombok.jar wersja dystrybucyjna Uruchomienie aplikacji: $ java jar app.jar Dwuklik na pliku w trybie graficznym
UberJar 3 Standardowe archiwum JAR nie zawiera zależności programu Biblioteki zewnętrzne jako osobne pliki.jar w lokalizacjach wskazanych przez atrybut Class-Path pliku MANIFEST.MF Kłopotliwa dystrybucja aplikacji wiele plików UberJar archiwum zawierające aplikację oraz wszystkie jej zależności Biblioteki zewnętrzne wypakowane do głównego JARa aplikacji Łatwa dystrybucja pojedynczy plik Większy rozmiar JARa, dłuższy czas budowania Archiwa WAR (Web ARchive) oraz EAR (Enterprise ARchive) domyślnie zawierają zależności
Budowanie aplikacji 4 Na szczęście nie musimy robić tego ręcznie Popularne narzędzia à Maven Gradle n Domyślny dla aplikacji na Androida Ant najstarszy Java Tools and Technologies Landscape Report 2016: https://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/
5 Maven
Maven 6 Narzędzie do zarządzania projektem Scaffolding (archetypy) Zarządzanie zależnościami (biblioteki zewnętrzne) Budowanie projektu Generowanie dokumentacji (javadoc) Uruchamianie testów n Generowanie raportów Pierwsze wydanie: lipiec 2004 Obecnie wersja 3.3.x (2017)
Maven 7 Nie jest związany z żadnym IDE i nie wymaga żadnego IDE do działania ale wszystkie popularne IDE posiadają integrację z Mavenem Samodzielne narzędzie Możliwe do wywołania w konsoli, np.: $ mvn package Możliwe do użycia w skryptach lub z poziomu automatycznych narzędzi n np. serwer continuous integration
Minimalny pom.xml 8 pom.xml główny plik konfiguracyjny Convention Over Configuration <project> <modelversion>4.0.0</modelversion> <groupid>pl.edu.pg.eti</groupid> <artifactid>pt-sample</artifactid> <version>1.3.1</version> </project> grupa wersja nazwa artefaktu (biblioteki/aplikacji)
<project> <modelversion>4.0.0</modelversion> <groupid>net.stawrul.sockets</groupid> <artifactid>server</artifactid> <version>1.0-snapshot</version> <packaging>jar</packaging> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!--zależności--> </dependencies> <build> <plugins> <!--wtyczki--> </plugins> </build> </project> minimalna wersja JVM do uruchomienia aplikacji kodowanie plików projektu 9 Dodatkowe elementy wersja języka dla plików źródłowych
Cykle życia 10 Cykle życia (ang. lifecycles) stanowią podstawową koncepcję Mavena Wbudowane cykle życia: default umożliwiający budowanie projektu, jego wdrażanie i publikację artefaktów clean umożliwia wyczyszczenie projektu (usunięcie wszystkich plików powstających w cyklu default) site umożliwiający wygenerowanie statycznych stron HTML z dokumentacją projektu
Cykle życia i ich fazy 11 Każdy cykl życia składa się z faz (ang. phases) Główne fazy cyklu default: validate weryfikacja czy projekt i jego konfiguracja są kompletne compile kompilacja źródeł test testy jednostkowe package budowanie archiwum JAR/WAR/EAR verify testy integracyjne, QA install instalacja artefaktu w lokalnym repozytorium n Inne lokalne projekty mogą korzystać z zależności deploy publikacja artefaktu w zewnętrznym repozytorium n Inni deweloperzy mogą korzystać z zależności
Cykle życia, ich fazy i cele 12 Każda faza składa się z listy celów (ang. goals) Wtyczki mogą dodawać własne cele do faz wzbogacając proces budowania aplikacji Fazy i cele można wywoływać z wiersza poleceń, np.: $ mvn package Najpierw wykonane zostaną wszystkie fazy poprzedzające package w cyklu życia default
Podstawowe polecenia 13 $ mvn package Zbudowanie projektu (kompiluje tylko pliki, które uległy zmianie od poprzedniej budowy) $ mvn clean Wyczyszczenie projektu $ mvn clean package Przebudowanie projektu: wyczyszczenie, a następnie kompilacja wszystkich plików źródłowych projektu
14 Zarządzanie zależnościami Fragment drzewa zależności typowej aplikacji internetowej
Zależności projektu 15 Biblioteki używane w naszym projekcie często zbudowane są w oparciu o inne biblioteki Te inne biblioteki opierają się na jeszcze innych bibliotekach n Zależności mają swoje własne zależności powstaje drzewo zależności Konkretna wersja biblioteki zależy od konkretnych wersji swoich zależności Aktualizacja biblioteki pociąga konieczność aktualizacji całej gałęzi drzewa zależności
Zależności projektu 16 Zależnościami można zarządzać ręcznie Google.com szukamy strony projektu Wchodzimy na stronę biblioteki Dział Downloads Pobieramy archiwum zip Rozpakowujemy Kopiujemy plik.jar z biblioteką do naszego projektu I tak dla każdej zależności w drzewie Ręczne zarządzanie zależnościami jest czasochłonne, kłopotliwe i po prostu nudne
Automatyczne zarządzanie zależnościami 17 Kluczowy element dla sukcesu Mavena Inne języki doczekały się podobnych narzędzi, np.: NuGet (.NET, 2010), npm (Node.js, 2010), pip (Python, 2011), Composer (PHP, 2012), Bower (web front-end, 2012) Zależności projektu definiowane w pliku pom.xml Wszystkie biblioteki (wraz z ich zależnościami) automatycznie pobierane z repozytoriów zależności Każda biblioteka w repozytorium zależności posiada własny plik pom.xml Zależności pobierane na etapie budowania aplikacji (faza package)
Repozytoria zależności 18 Maven Central repozytorium domyślne, publiczne https://search.maven.org/ Zewnętrzne repozytoria publiczne (3 rd party) np. https://repository.jboss.org/nexus/ Własne repozytoria prywatne np. wewnętrzne biblioteki używane w firmie Nexus Repository OSS n Bower, Docker, Maven, npm, NuGet, PyPI, RubyGems Repozytorium lokalne Lokalnie zbudowane artefakty na komputerze dewelopera Cache dla bibliotek pobranych z zewnętrznych repozytoriów ${user.home}/.m2/repository
Zależności 19 <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.16.14</version> </dependency> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency>
Zasięgi zależności: <scope> 20 Compile Wymagane w czasie kompilacji oraz w czasie działania aplikacji Provided Jak wyżej, ale dostarczane przez środowisko wykonawcze, np. serwer aplikacji Runtime Wymagane w czasie działania aplikacji (ale nie w czasie kompilacji) Test Wymagane w czasie uruchamiania testów jednostkowych Import Import zależności z innego pliku pom.xml System niezalecane
Wtyczki 21 Dostarczają dodatkowych funkcjonalności, np.: Wygenerowanie pliku MANIFEST.MF Zbudowanie UberJara Zbudowanie obrazu Dockera Wdrożenie na serwerze aplikacji Wygenerowanie raportu z testów Dołączenie do projektu numeru rewizji z repozytorium kontroli wersji
maven-jar-plugin 22 <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-jar-plugin</artifactid> <version>2.6</version> <configuration> <archive> <manifest> <addclasspath>true</addclasspath> <mainclass>net.stawrul.app</mainclass> </manifest> </archive> </configuration> </plugin>
23 Pytania?