Apache Maven

Apache Maven
Typ Vybudujte automatizaci a systém správy balíků
Vývojář Apache Software Foundation
Zapsáno v Java [3] [4] [5]
Operační systém multiplatformní
První vydání 1. února 2008 [1]
Hardwarová platforma Java virtuální stroj
Nejnovější verze
Čitelné formáty souborů metadata maven [d]
Vygenerované formáty souborů metadata maven [d]
Licence Licence Apache 2.0
webová stránka maven.apache.org
 Mediální soubory na Wikimedia Commons

Apache Maven  je framework pro automatizaci sestavování projektů na základě popisu jejich struktury v souborech v jazyce POM ( Project Object Model ) ,  který je podmnožinou XML [6] . Projekt Maven je publikován nadací Apache Software Foundation , kde je formálně součástí Jakartského projektu .

Název systému je slovo v jidiš , jehož význam lze zhruba vyjádřit jako „sběratel znalostí“ [7] .

Maven poskytuje deklarativní , nikoli imperativní (na rozdíl od nástroje pro automatizaci sestavení Apache Ant ) sestavení projektu. Soubory popisu projektu obsahují specifikaci projektu, nikoli jednotlivé prováděcí příkazy. Všechny úlohy zpracování souborů popsané ve specifikaci zpracovává Maven prostřednictvím řady vestavěných a externích pluginů.

Maven se používá k vytváření a správě projektů napsaných v jazycích JavaC#RubyScala a dalších [8] .

Mezi pozoruhodné alternativy patří systém automatického sestavení Gradle , který je postaven na principech Apache Ant a Maven, ale místo konfigurace POM používá specializované Groovy DSL.

Historie vývoje

Maven byl vytvořen Kanaďanem Jasonem van Zylem a firmou Sonatype , kterou založil . Začalo to jako podprojekt Apache Turbine v roce 2002 a v roce 2003 byl Maven kvalifikován jako projekt Apache nejvyšší úrovně, zároveň se objevila jeho první verze - Maven 1.x, publikovaná 13. července 2004 jako verze 1.0. Stalo se to však tak rychle, že některé detaily nebyly promyšleny, například příliš mnoho konfigurace, problémy s výkonem.

Proto byl koncept dopracován a v roce 2005 začal paralelní vývoj Maven 2.x, který byl ve verzi 2.0 dodán 19. října 2005. [9]

Maven 1.x není dále vyvíjen a je omezen na uživatelskou podporu a opravy chyb. [deset]

Vývoj Maven 3.0 začal v roce 2008. Po osmi vydáních alfa byla v říjnu 2010 zveřejněna první beta verze Maven 3.0. Zvláštní pozornost byla věnována jeho zpětné kompatibilitě s Maven 2. U většiny projektů nevyžaduje přechod z Maven 2 na Maven 3 žádné změny [11] .

Vývoj Maven probíhá v následujících dílčích projektech:

Popis projektu Objektový model

Informace pro vytvoření projektu podporovaného Apache Maven jsou obsaženy v souboru XML s názvem pom.xml . Při spuštění Maven zkontroluje, zda konfigurační soubor obsahuje všechna požadovaná data a zda jsou všechna data syntakticky správná.

Příklad souboru pom.xml :

<project> <!-- verze modelu pro Maven 2.x POM je vždy 4.0.0 --> <modelVersion> 4.0.0 </modelVersion> <!-- souřadnice projektu, tedy sada hodnot, která vám umožňuje jednoznačně identifikovat tento projekt --> <groupId> com.mycompany.app </groupId> <artifactId> moje aplikace </artifactId> <version> 1.0 </version> <!-- knihovny závislostí --> <dependencies> <dependencies> <!-- souřadnice požadované knihovny --> <groupId> junit < /groupId> <artifactId> junit </artifactId> <version> 3.8.1 </version> <!-- tato knihovna se používá pouze ke spouštění a kompilaci testů --> <scope> test </scope> </dependency> </dependencies> </project>

Minimální konfigurace obsahuje verzi konfiguračního souboru, název projektu, jeho autora a verzi [12] . Pomocí pom.xml se konfigurují závislosti na jiných projektech, jednotlivé fáze procesu sestavení projektu (proces sestavení), seznam pluginů , které implementují pořadí sestavení [12] .

Velké projekty lze rozdělit do několika modulů nebo podprojektů, z nichž každý má svůj vlastní POM. Operace na modulech lze provádět prostřednictvím společného kořenového POM pomocí jediného příkazu.

Soubory POM dílčího projektu mohou zdědit konfiguraci z jiných konfiguračních souborů. Současně jsou všechny konfigurační soubory ve výchozím nastavení nutně zděděny ze souboru "Super POM" [13] . Super POM poskytuje výchozí konfiguraci, jako je výchozí adresářová struktura, výchozí pluginy, vazba na fáze životního cyklu a další.

Základní pojmy

Konfigurační konvence

Maven podporuje princip konvence po konfiguraci , což je, že daný aspekt potřebuje konfiguraci tehdy a pouze tehdy, když tento aspekt nesplňuje nějakou specifikaci. V důsledku toho se snižuje množství požadované konfigurace bez ztráty flexibility. Jedním z důsledků tohoto principu je, že není potřeba explicitně specifikovat cesty k souboru, což zjednodušuje obsah souboru pom.xml . Téměř všechny standardy, na které se Maven opírá, však lze změnit individuální konfigurací [14] [15] .

Archetypy

Maven využívá princip mavenských archetypů (angl. Archetypes ). Archetyp je nástroj vzorů, z nichž každý je definován vzorem nebo modelem, analogicky se kterými se vytvářejí deriváty. [16]

Výchozí adresářová struktura je jednou z Mavenových implementací principu archetypu. Následující struktura ukazuje nejdůležitější adresáře pro projekt Java [17] :

  • Kořenový adresář projektu : soubor pom.xml a všechny další podadresáře
    • src : všechny zdrojové soubory
      • src/main : zdrojové soubory pro samotný produkt
        • src/main/java : zdroj Java
        • src/main/resources : další soubory, které se používají během kompilace nebo provádění, jako jsou soubory vlastností
      • src/test : zdrojové soubory potřebné k nastavení automatického testování
        • src/test/java : Testovací případy JUnit pro automatizované testování
    • cíl : všechny soubory vytvořené během Mavenovy práce
      • target/classes : kompilované třídy Java

Životní cyklus

Životní cyklus maven projektu je seznam pojmenovaných fází, které určují pořadí akcí při jeho budování. Životní cyklus Maven obsahuje tři nezávislé prováděcí příkazy: [18]

  • clean - životní cyklus čištění projektu. Obsahuje následující fáze:
    1. předem vyčistit
    2. čistý
    3. post čisté
  • výchozí je hlavní životní cyklus obsahující následující fáze:
    1. validovat - kontroluje, zda je struktura projektu úplná a správná.
    2. generovat-zdroje
    3. procesní zdroje
    4. generovat-zdroje
    5. procesní zdroje
    6. kompilovat - jsou sestaveny zdroje.
    7. proces-test-zdroje
    8. proces-test-zdroje
    9. zkušební kompilace
    10. test - sestavený kód je testován předem připravenou sadou testů.
    11. package - balení kompilovaných tříd a dalších zdrojů. Například v souboru JAR.
    12. integrační test - software jako celek nebo jeho velké moduly jsou podrobeny integračnímu testování. Je kontrolována interakce mezi komponentami softwarového produktu.
    13. nainstalovat - nainstalujte software do místního úložiště Maven, abyste jej zpřístupnili dalším projektům aktuálního uživatele.
    14. nasazení – Stabilní verze softwaru je distribuována do vzdáleného úložiště Maven, aby byla zpřístupněna ostatním uživatelům.
  • místo - životní cyklus generování projektové dokumentace. Skládá se z fází:
    1. pre-site
    2. místo
    3. místo příspěvku
    4. site-deploy

Standardní životní cykly lze vylepšit funkčností pomocí zásuvných modulů Maven. Pluginy umožňují vkládat nové kroky do standardního cyklu (například distribuce na aplikační server) nebo rozšiřovat stávající kroky.

Architektura

Maven je založen na architektuře pluginů , která vám umožňuje používat pluginy pro různé úlohy ( kompilace ,  test, sestavení, nasazení, checkstyle, pmd, scp-transfer ) pro daný projekt, aniž byste je museli explicitně instalovat. To je možné díky skutečnosti, že informace přicházejí do pluginu přes standardní vstup a výsledky jsou zapisovány na jeho standardní výstup. Teoreticky to umožňuje komukoli psát zásuvné moduly pro interakci s nástroji pro sestavení projektu (kompilátory, testovací nástroje a tak dále) pro jakýkoli jiný jazyk. Ve skutečnosti je podpora jiných jazyků než Java v současnosti minimální. Existuje plugin pro .NET framework [19] a také pluginy pro C / C++ [20] [21] .

Počet dostupných pluginů je v současné době velmi velký a zahrnuje mimo jiné pluginy, které umožňují spustit webovou aplikaci přímo z Mavenu a otestovat ji v prohlížeči; pluginy, které umožňují testovat nebo vytvářet databanky; pluginy, které umožňují generovat webové služby. Úkolem vývojáře v takové situaci je najít a aplikovat nejvhodnější sadu plug-inů.

Plugin dosahuje řady cílů s následující syntaxí:

mvn [název pluginu]:[cílové jméno]

Například projekt Java lze zkompilovat pomocí kompilátorového pluginu [22] spuštěním příkazu mvn compiler:compile.

Existují pluginy Maven pro vytváření, testování, ovládání zdroje, provozování webového serveru, generování souborů projektu Eclipse a další. [23] Pluginy jsou uvedeny a konfigurovány v části <plugins>souboru pom.xml . V každém projektu je standardně zahrnuta některá základní skupina pluginů.

Závislosti

Soubor pom.xml určuje závislosti, které má projekt spravovaný Mavenem. Správce závislostí je založen na několika základních principech:

  • Úložiště. Maven hledá potřebné soubory v místních adresářích nebo v místním úložišti maven. Pokud závislost nelze vyřešit lokálně, Maven se připojí k určenému úložišti maven v síti a zkopíruje do místního úložiště. Maven standardně používá centrální úložiště Maven [24] , ale vývojář může nakonfigurovat další veřejná úložiště Maven, jako je Apache, Ibiblio, Codehaus nebo Java.Net.
  • tranzitivní závislosti. Potřebné knihovny se do projektu načtou automaticky. Při řešení konfliktů verzí se používá princip „nejbližší“ závislosti, to znamená, že se vybere závislost, ke které je cesta přes seznam závislých projektů nejkratší.
  • Odstraňte závislosti. Soubor popisu projektu poskytuje možnost vyloučit závislost v případě detekce cykličnosti nebo nedostatku potřeby konkrétní knihovny.
  • Hledejte závislosti. Závislosti (open-source knihovny a moduly) se hledají podle jejich souřadnic (groupId, artifactId a version). Tyto souřadnice lze určit pomocí speciálních vyhledávačů, jako je vyhledávač Maven [25] . Například pro vyhledávací atribut "pop3" vyhledávač vrátí výsledek s groupId="com.sun.mail" a artifactId="pop3".
  • Správci úložišť. Repozitáře jsou implementovány pomocí Maven Repository Managers jako Apache Archiva, Nexus (dříve Proximity), Artifactory, Codehaus Maven Proxy nebo Dead Simple Maven Proxy [26] .

Rozsah závislostí vám umožňuje zahrnout závislosti pouze v určité fázi vytváření projektu. Existuje 6 možných oblastí [27] :

  1. kompilovat. Výchozí oblast. Závislost je k dispozici ve všech cestách hledání třídy v projektu. Distribuováno do závislých projektů.
  2. pokud. Rozsah je podobný kompilaci, kromě toho, že samotný JDK nebo kontejner dodá závislost za běhu.
  3. runtime. Závislost není potřeba pro kompilaci, ale je potřeba pro spuštění.
  4. test. Závislost není potřeba pro běžný provoz aplikace, ale je potřeba pouze pro kompilaci a spouštění testů.
  5. Systém. Rozsah je podobný uvedenému, s tím rozdílem, že JAR obsahující závislost je výslovně specifikován. Artefakt není vyhledán v úložišti.
  6. import (od Maven 2.0.9) se používá pouze se závislostí pom v <dependencyManagement>. Závislosti aktuálního POM jsou nahrazeny závislostmi ze zadaného POM.

Aby projekt vypadal jako Maven

Projekt udržovaný pomocí Maven musí splňovat určité podmínky, aby byl čitelný pro nástroj, analyzoval a sestavoval. To ukládá určitá omezení na strukturu adresářů a vyžaduje další kroky, pokud má projekt zpočátku jinou strukturu. [28]

Aby Maven rozpoznal projekt jako zpracovávaný, musí obsahovat zavedenou adresářovou strukturu. Všechny soubory zdrojového kódu musí být umístěny v relativní cestě " \src\main\java " [17] .

Konfigurační soubor webového projektu web.xml musí být umístěn v adresáři \src\main\webapp\WEB-INF [17 ] .

Konfigurační soubor pom.xml projektu Maven musí být umístěn v kořenovém adresáři projektu. Podle účelu může obsahovat vzdálené úložiště, pluginy pro vytváření archivů, plugin kompilátoru a tak dále. Webový projekt také potřebuje přidat další závislosti, jako je javaee.jar.

Takže výstupní konfigurační soubor webového projektu, konzistentní s Maven, vypadá takto:

<project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http:/ /maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" > <modelVersion> 4.0.0 </modelVersion> <groupId> com.mkyong </groupId> < artifactId> servletdemo </artifactId> <packaging> war </packaging> <version> 1.0-SNAPSHOT </version> <name> servletdemo </name> <url> http://maven.apache.org </url> <repositories> <repository> <id> java.net </id> <url> http://download.java.net/maven/2 </url> </repository> </repositories> <build> <plugins> <plugin> <groupId> org.apache.maven.plugins < /groupId> <artifactId> maven-war-plugin </artifactId> <configuration> <webResources> <resource> <directory> ${basedir }/src/main/java </directory> <targetPath> WEB-INF/classes </targetPath> <includes> <include> **/*.properties </include> <include> **/*.xml </ include> <include> **/*.css </include> <include> **/*.html </include> </includes> </resource> </webResources> </configuration> </plugin> <plugin > <artifactId> maven-compiler-plugin </artifactId> <configuration> <source> 1.6 </source> <target> 1.6 </target> </configuration> </plugin> </plugins> </build> </ projekt>

Jakmile budou splněny všechny výše uvedené požadavky, je projekt Maven připraven provést fáze životního cyklu, jako je kompilace, sestavení archivu a generování dokumentace [29] .

Příklad výstupního protokolu zpráv při provádění příkazu mvn war:war:

E:\workspace\servletdemo>mvnwar:war [INFO] Vyhledávání projektů... ........ [INFO] Zpracování válečného projektu [INFO] Kopírování prostředků webové aplikace[E:\workspace\servletdemo] [INFO] Webapp sestavena za [47 ms] [INFO] Válka budov: E:\workspace\servletdemo\target\servletdemo-1.0-SNAPSHOT.war [INFO]----------------------------------------------- ----- [INFO] STAVBA ÚSPĚŠNÁ [INFO]----------------------------------------------- -----

Interakce s vývojovými prostředími

Pro některá IDE poskytuje Maven zásuvné moduly, které vám umožňují spravovat životní cyklus prováděním příkazů pomocí rozhraní IDE. Seznam takových vývojových prostředí zahrnuje Eclipse (prostřednictvím pluginu M2eclipse ), IntelliJ IDEA , NetBeans , JBuilder , JDeveloper (verze 11.1.2), MyEclipse, Emacs [30]

Tyto pluginy také poskytují možnost pohodlně upravovat POM nebo používat POM k úplnému popisu závislostí projektu pro potřeby IDE, které používáte.

Poznámky

  1. CrunchBase  (anglicky) - 2007.
  2. https://maven.apache.org/docs/3.8.6/release-notes.html
  3. https://www.zhihu.com/question/20297619
  4. Projekt maven2 Open Source na Open Hub: Stránka jazyků - 2006.
  5. https://projects.apache.org/json/projects/maven.json
  6. Archivovaná kopie (odkaz není dostupný) . Získáno 26. února 2012. Archivováno z originálu 19. února 2012.   POM
  7. Maven – Co je Maven? . Získáno 25. února 2012. Archivováno z originálu 21. února 2012.
  8. Komunita Apache Maven. Plugin kompilátoru Apache Maven . Projekt Apache Maven . Datum přístupu: 18. prosince 2015. Archivováno z originálu 13. prosince 2015.
  9. Historický archiv verzí Maven Archivováno 11. února 2012 na Wayback Machine .
  10. Oficiální stránka Maven 1.x Archivováno 15. února 2012.
  11. ↑ 1 2 Nadace Apache Maven. Historie vydání Maven . Dokumenty Apache Maven . Získáno 20. prosince 2015. Archivováno z originálu 19. prosince 2015.
  12. ↑ 1 2 Základy Apache. Minimální obsah souboru POM je . Projekt Apache Maven . Získáno 6. října 2007. Archivováno z originálu dne 19. listopadu 2017.
  13. Super POM Archivováno 19. listopadu 2017 na Wayback Machine .
  14. Maven by Example Archivováno 15. září 2020 na Wayback Machine .
  15. Co je konvence nad konfigurací? . Získáno 28. října 2016. Archivováno z originálu 14. září 2016.
  16. Apache Maven Foundation. Dokumentace Maven. Archetypy. . Datum přístupu: 18. prosince 2015. Archivováno z originálu 22. prosince 2015.
  17. ↑ 1 2 3 Oficiální stránka Apache Maven: Struktura adresáře Archivováno 21. února 2012 na Wayback Machine .
  18. Maven Build Lifecycle Reference Archived 17. listopadu 2017 na Wayback Machine .
  19. .NET Maven Plugin Archivován 27. října 2016 na Wayback Machine .
  20. Native Maven Plugin archivován 29. října 2016 na Wayback Machine .
  21. NAR plugin Archivováno 20. prosince 2017 na Wayback Machine .
  22. Maven Compiler Plugin Archived 15. prosince 2017 na Wayback Machine .
  23. Maven - Dostupné pluginy Archivováno 24. července 2017 na Wayback Machine .
  24. Centrální úložiště Maven Archivováno 26. dubna 2020 na Wayback Machine .
  25. Vyhledávač Maven Archivováno 26. dubna 2020 na Wayback Machine .
  26. Srovnávací tabulka Archivována 23. listopadu 2012.
  27. Apache Maven Foundation. dokumentace maven. Úvod do mechanismu závislosti . Datum přístupu: 18. prosince 2015. Archivováno z originálu 20. prosince 2015.
  28. Jak převést webový projekt na projekt Maven Archivováno 21. února 2012 na Wayback Machine .
  29. Nadace Apache. Budování projektu s Mavenem . Dokumentace Apache Maven . Datum přístupu: 21. prosince 2015. Archivováno z originálu 3. ledna 2016.
  30. EmacsWiki: Malabar Mode Archivováno 3. listopadu 2013 na Wayback Machine .

Odkazy

  • Vygovský Leonid. Instalace repozitáře Artifactory maven (5. ledna 2010). — Tento článek obsahuje podrobné pokyny, jak nainstalovat úložiště maven na aplikační server Glassfish nebo kontejner servletu Apache Tomcat. Přístup 5. ledna 2010. Archivováno 29. února 2012.