Lekce 3 - Kompilace a spuštění projektu s Mavenem z příkazové řádky
V předchozí lekci, Instalace Mavenu a tvorba prvního projektu, jsme si zprovoznili Maven a vytvořili jsme
s jeho pomocí nový hello-world projekt.
Dnes si v Maven tutoriálu ukážeme některé základní úkony, které můžeme s naším projektem udělat. Především se podíváme na to, jak naše zdrojové kódy pomocí Mavenu zkompilovat, spustit a vyčistit.
Zkompilování projektu
Nejprve se naučíme náš projekt pomocí Mavenu z příkazové řádky
zkompilovat. Využijeme k tomu náš Hello world projekt, který
jsme si vytvořili v lekci Instalace Mavenu a
tvorba prvního projektu.
Přepneme se v konzoli do adresáře s hello-world projektem a
spustíme příkaz:
$ mvn compile
Abychom se v příkazové řádce dostali z nadřazené složky
do adresáře s naším projektem, použijeme příkaz change
directory: $ cd hello-world. Příkazovou řádku lze také
otevřít přímo ve složce, když na ni klikneme pravým tlačítkem myši a
zvolíme možnost Otevřít v aplikaci Terminal.
Po spuštění kompilace se nám objeví výpis obsahující následující informace:
Command line [INFO] Scanning for projects... [INFO] [INFO] ----------------------< cz.itnetwork:hello-world >---------------------- [INFO] Building hello-world 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ hello-world --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /home/atrament/Nextcloud/my-documents/itnetwork/java/Maven p [INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ hello-world --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /home/atrament/Nextcloud/my-documents/itnetwork/java/Maven p [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.586 s [INFO] Finished at: 2023-06-04T23:43:41+01:00 [INFO] ------------------------------------------------------------------------
Z celého textu nás nejvíce zajímá hláška BUILD SUCCESS,
která dává najevo, že se všechno povedlo a projekt byl úspěšně
zkompilován. Pojďme se o tom přesvědčit pohledem do našeho projektu. Když
se nyní v podíváme do složky hello-world/, zjistíme, že se v
něm vytvořil nový podadresář target/ s vygenerovanými
soubory.
Také tento adresář je součástí standardizované struktury
projektu, kterou Maven prosazuje, jak jsme si uvedli už dříve. V
projektu tak máme nyní dva adresáře src/ a
target/. Vidíme, že Maven striktně udržuje naše
soubory se zdrojovým kódem oddělené od zkompilovaných
souborů.
Opětovná kompilace projektu
O pár řádků výš v předchozím výpisu nalezneme také toto oznámení:
Command line
...
[INFO] Changes detected - recompiling the module!
...
Maven totiž napřed zkontroluje, zda je vůbec potřeba něco zkompilovat a teprve pak doopravdy kompiluje. To je velmi výhodné u velkých projektů obsahujících mnoho souborů. Není totiž potřeba po každé změně v zdrojovém kódu kompilovat úplně všechny soubory znova, stačí zkompilovat jenom ty, co se změnily.
Toto tvrzení si také snadno ověříme opětovným spuštěním příkazu
$ mvn compile. Pokud jsme mezitím nic nezměnili v souboru
App.java, tak se po spuštění další kompilace objeví ve
výstupu následující informace:
Command line
...
[INFO] Nothing to compile - all classes are up to date
...
Spuštění aplikace
Nyní si ukážeme, jak naši aplikaci spustit. Mohli bychom spustit
zkompilovaný soubor obvyklým způsobem. Naše aplikace obsahuje pouze jednu
třídu App, která zároveň obsahuje metodu main().
Její zkompilovaná podoba se nyní nachází v adresáři
target/classes/, proto přidáme tento adresář na
classpath a spustíme metodu main() ve třídě
App:
$ java -cp target/classes/ cz.itnetwork.App
Jelikož jsme ale v seriálu o Mavenu, pojďme si ukázat jak to zařídit s jeho pomocí.
Spuštění pluginem exec
Ke spouštění aplikace Mavenem slouží plugin exec a jeho
goal java. O tom, co je to goal a co jsou to pluginy, si povíme
více příště. Nyní se spokojíme s informací, že spuštění
mavenovského pluginu docílíme tím, že za příkaz mvn
přidáme název pluginu a jeho goal oddělený dvojtečkou.
V adresáři s naším projektem tedy nyní projekt spustíme příkazem:
$ mvn exec:java
Místo námi očekávaného vypsání Hello World! do konzole
však tentokrát vidíme výpis BUILD FAILURE a o kousek níže
popis chyby:
Command line ... [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:java (default-cli) on project hello-world: The parameters 'mainClass' for goal org.codehaus.mojo:exec-maven-plugin:3.0.0:java are missing or invalid -> [Help 1] ...
Nastavení hlavní třídy projektu
Maven nám v něm říká, že nemáme nastavený parametr
mainClass, neboli třídu, která obsahuje metodu
main(). Neví tedy, co má spustit a musíme mu to říct. Máme
dvě možnosti, jak tento problém vyřešit. Dnes si ukážeme, jak lze
požadovaný parametr definovat na příkazové řádce pomocí nám již
známého přepínače -D:
$ mvn exec:java -Dexec.mainClass=cz.itnetwork.App // Pro plugin `exec` definujeme proměnnou `mainClass`
Po opětovném spuštění projektu Mavenem už nyní všechno proběhne správně:
Command line [INFO] Scanning for projects... [INFO] [INFO] ----------------------< cz.itnetwork:hello-world >---------------------- [INFO] Building hello-world 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ hello-world --- Hello World! [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.308 s [INFO] Finished at: 2023-05-29T08:50:32+01:00 [INFO] ------------------------------------------------------------------------
Na výstupu nyní tedy mezi všemi těmi mavenovskými výpisy uvidíme i
naše Hello World!.
Druhé řešení spočívá v nastavení parametru přímo v konfiguraci projektu. Tento způsob si ukážeme v některé z příštích lekcí.
Vyčištění projektu
Někdy je potřeba projekt také vyčistit, tedy odstranit všechny soubory, které vznikly při kompilaci.
K tomu slouží jednoduchý příkaz:
$ mvn clean
Po spuštění tohoto příkazu se do konzole vypíše:
Command line [INFO] Scanning for projects... [INFO] [INFO] ----------------------< cz.itnetwork:hello-world >---------------------- [INFO] Building hello-world 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ hello-world --- [INFO] Deleting /home/atrament/Nextcloud/my-documents/itnetwork/java/Maven p [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.344 s [INFO] Finished at: 2023-06-14T17:24:50+02:00 [INFO] ------------------------------------------------------------------------
Když se poté přesuneme do složky s naším projektem, uvidíme, že zde
zbyl pouze adresář src/ s naším souborem App.java.
Adresář target/ s kompilovaným souborem byl celý
odstraněn.
V další lekci, Životní cykly a fáze Mavenu, pluginy a jejich cíle, si vysvětlíme, co je to v Mavenu životní cyklus a jaké má fáze. Dozvíme se také, co jsou to pluginy a popíšeme si jejich cíle.

