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.