Apache Maven

Apache Maven
Sorts Bygg automation och pakethanteringssystem
Utvecklaren Apache Software Foundation
Skrivet i Java [3] [4] [5]
Operativ system plattformsoberoende
Första upplagan 1 februari 2008 [1]
Hårdvaruplattform Java Virtual Machine
senaste versionen
Läsbara filformat maven metadata [d]
Genererade filformat maven metadata [d]
Licens Apache-licens 2.0
Hemsida maven.apache.org
 Mediafiler på Wikimedia Commons

Apache Maven  är ett ramverk för att automatisera sammansättningen av projekt baserat på beskrivningen av deras struktur i filer i språket POM ( Project Object Model ) ,  som är en delmängd av XML [6] . Maven-projektet publiceras av Apache Software Foundation , där det formellt är en del av Jakarta-projektet .

Namnet på systemet är ett jiddisch ord , vars betydelse grovt kan uttryckas som "insamlare av kunskap" [7] .

Maven tillhandahåller deklarativ , inte imperativ (till skillnad från Apache Ant byggautomatiseringsverktyg ) projektuppbyggnad. Projektbeskrivningsfiler innehåller projektspecifikationen, inte enskilda exekveringskommandon. Alla filbearbetningsuppgifter som beskrivs i specifikationen hanteras av Maven genom en serie inbyggda och externa plugins.

Maven används för att bygga och hantera projekt skrivna i JavaC#RubyScala och andra språk [8] .

Anmärkningsvärda alternativ inkluderar Gradle automatiserade byggsystem , som är byggt på principerna för Apache Ant och Maven, men använder en specialiserad Groovy DSL istället för en POM-konfiguration.

Utvecklingshistorik

Maven skapades av kanadensaren Jason van Zyl och Sonatype , ett företag som han grundade . Det började som ett delprojekt till Apache Turbine 2002, och 2003 kvalificerades Maven som ett Apache-projekt på toppnivå, samtidigt som dess första version dök upp - Maven 1.x, publicerad den 13 juli 2004 som version 1.0. Detta hände dock så snabbt att vissa detaljer inte var genomtänkta, till exempel för mycket konfiguration, prestandaproblem.

Därför färdigställdes konceptet och 2005 påbörjades parallell utveckling av Maven 2.x, som levererades i version 2.0 den 19 oktober 2005. [9]

Maven 1.x är inte vidareutvecklad och är begränsad till användarsupport och buggfixar. [tio]

Utvecklingen av Maven 3.0 startade 2008. Efter åtta alfautgåvor publicerades den första betaversionen av Maven 3.0 i oktober 2010. Särskild uppmärksamhet har ägnats åt dess bakåtkompatibilitet med Maven 2. För de flesta projekt krävs inga ändringar för att flytta från Maven 2 till Maven 3 [11] .

Maven-utveckling sker i följande delprojekt:

Projektbeskrivning Objektmodell

Informationen för att bygga ett projekt som stöds av Apache Maven finns i en XML -fil som heter pom.xml . Vid uppstart kontrollerar Maven att konfigurationsfilen innehåller all nödvändig data och att all data är syntaktisk korrekt.

Ett exempel på pom.xml -fil :

<project> <!-- modellversion för Maven 2.x POM är alltid 4.0.0 --> <modelVersion> 4.0.0 </modelVersion> <!-- koordinater för projektet, det vill säga en uppsättning värden som låter dig identifiera detta projekt unikt --> <groupId> com.mycompany.app </groupId> <artifactId> my-app </artifactId> <version> 1.0 </version> <!-- biblioteksberoenden --> <beroenden> <beroenden> <!-- koordinater för obligatoriskt bibliotek --> <groupId> junit </groupId> <artifactId> junit </artifactId> <version> 3.8.1 </version> <!-- detta bibliotek används endast för att köra och kompilera tester --> <scope> test </scope> </dependency> </dependencies> </project>

Minimikonfigurationen inkluderar versionen av konfigurationsfilen, projektets namn, dess författare och versionen [12] . Med hjälp av pom.xml konfigureras beroenden av andra projekt, individuella faser av projektets byggprocess (byggprocessen), en lista med plugins som implementerar byggordningen [12] .

Stora projekt kan delas upp i flera moduler, eller delprojekt, var och en med sin egen POM. Operationer på moduler kan utföras genom en gemensam rot-POM med ett enda kommando.

Delprojekt POM-filer kan ärva konfiguration från andra konfigurationsfiler. Samtidigt ärvs alla konfigurationsfiler nödvändigtvis från "Super POM"-filen [13] som standard. Super POM tillhandahåller standardkonfiguration, såsom en standardkatalogstruktur, standardinsticksprogram, bindning till livscykelfaser och mer.

Grundläggande begrepp

Konfigurationskonventioner

Maven stöder principen konvention-för-konfiguration , vilket innebär att en aspekt i fråga behöver en konfiguration om och endast om den aspekten inte uppfyller någon specifikation. Som en konsekvens minskar detta mängden konfiguration som krävs utan att förlora flexibilitet. En konsekvens av denna princip är att det inte finns något behov av att ange filsökvägar explicit, vilket förenklar innehållet i pom.xml . Men nästan alla standarder som Maven förlitar sig på kan ändras genom individuell konfiguration [14] [15] .

Arketyper

Maven använder principen om Maven-arketyper (Eng. Archetypes ). En arketyp är ett verktyg av mönster, som vart och ett definieras av ett mönster eller modell, i analogi med vilka derivator skapas. [16]

Standardkatalogstrukturen är en av Mavens implementeringar av arketypprincipen. Följande struktur visar de viktigaste katalogerna för ett Java-projekt [17] :

  • Projektets rotkatalog : filen pom.xml och alla ytterligare underkataloger
    • src : alla källfiler
      • src/main : källfiler för själva produkten
        • src/main/java : Java- källa
        • src/main/resources : andra filer som används under kompilering eller exekvering, såsom egenskapsfiler
      • src/test : källfiler som behövs för att ställa in automatisk testning
        • src/test/java : JUnit -testfall för automatiserad testning
    • target : alla filer som skapats under Mavens arbete
      • mål/klasser : kompilerade Java-klasser

Livscykel

Livscykeln för ett maven-projekt är en lista med namngivna faser som bestämmer ordningen på åtgärder när det byggs. Mavens livscykel innehåller tre oberoende exekveringsorder: [18]

  • ren - livscykel för rengöring av projektet. Innehåller följande faser:
    1. förren
    2. rena
    3. inlägg rent
  • standard är den huvudsakliga livscykeln som innehåller följande faser:
    1. validera - kontrollerar om projektstrukturen är komplett och korrekt.
    2. generera-källor
    3. processkällor
    4. generera-resurser
    5. processresurser
    6. kompilera - källor kompileras.
    7. process-test-källor
    8. process-test-resurser
    9. testkompilera
    10. test - den sammansatta koden testas av en förberedd uppsättning tester.
    11. paket - paketering av kompilerade klasser och andra resurser. Till exempel i en JAR-fil.
    12. integration-test - programvaran som helhet eller dess stora moduler utsätts för integrationstestning. Interaktionen mellan komponenterna i mjukvaruprodukten kontrolleras.
    13. installera - installera programvaran i det lokala Maven-förrådet för att göra det tillgängligt för andra projekt för den aktuella användaren.
    14. deploy - En stabil version av programvaran distribueras till ett Maven-repository för att göra det tillgängligt för andra användare.
  • webbplats - livscykel för generering av projektdokumentation. Består av faser:
    1. pre-site
    2. webbplats
    3. inlägg webbplats
    4. platsinstallation

Standardlivscykler kan förbättras med funktionalitet med Maven-plugins. Plugins låter dig infoga nya steg i standardcykeln (till exempel distribution till applikationsservern) eller utöka befintliga steg.

Arkitektur

Maven är baserad på en plugin- arkitektur som låter dig använda plugins för olika uppgifter ( kompilera ,  testa, bygga, distribuera, checkstyle, pmd, scp-transfer ) för ett givet projekt, utan att explicit behöva installera dem. Detta är möjligt på grund av det faktum att informationen kommer till plugin via standardingången, och resultaten skrivs till dess standardutgång. Teoretiskt tillåter detta vem som helst att skriva plugin-program för att interagera med projektets byggverktyg (kompilatorer, testverktyg och så vidare) för vilket annat språk som helst. I verkligheten är stödet för andra språk än Java för närvarande minimalt. Det finns en plugin för .NET-ramverket [19] samt plugins för C / C++ [20] [21] .

Antalet tillgängliga plugins är för närvarande mycket stort och inkluderar bland annat plugins som låter dig köra en webbapplikation direkt från Maven för att testa den i en webbläsare; plugins som låter dig testa eller skapa databanker; plugins som låter dig skapa webbtjänster. Utvecklarens uppgift i en sådan situation är att hitta och använda den mest lämpliga uppsättningen av plugin-program.

Pluginet uppnår ett antal mål med följande syntax:

mvn [pluginnamn]:[målnamn]

Till exempel kan ett Java-projekt kompileras med en kompilatorplugin [22] genom att utföra kommandot mvn compiler:compile.

Det finns Maven-plugins för att bygga, testa, kontrollera källkod, köra en webbserver, generera Eclipse - projektfiler och mer. [23] Plugins listas och konfigureras i en del av <plugins>filen pom.xml . Vissa grundläggande grupper av plugins ingår i varje projekt som standard.

Beroenden

Filen pom.xml anger de beroenden som ett Maven-hanterat projekt har. Beroendehanteraren bygger på flera kärnprinciper:

  • Förvar. Maven letar efter de nödvändiga filerna i lokala kataloger eller i det lokala maven-förrådet. Om beroendet inte kan lösas lokalt ansluter Maven till det angivna maven-förrådet på nätverket och kopierar till det lokala förvaret. Maven använder Maven Central Repository [24] som standard , men utvecklaren kan konfigurera andra offentliga Maven-repositories som Apache, Ibiblio, Codehaus eller Java.Net.
  • transitiva beroenden. De nödvändiga biblioteken laddas automatiskt in i projektet. Vid lösning av versionskonflikter används principen om "närmaste" beroende, det vill säga beroendet väljs, vägen till vilken genom listan över beroende projekt är den kortaste.
  • Eliminera beroenden. Projektbeskrivningsfilen ger möjlighet att utesluta ett beroende i händelse av upptäckt av cyklicitet eller brist på behov av ett visst bibliotek.
  • Sök efter beroenden. Beroenden (öppen källkodsbibliotek och moduler) söks efter deras koordinater (groupId, artifactId och version). Dessa koordinater kan bestämmas med hjälp av speciella sökmotorer, som Maven-sökmotorn [25] . Till exempel, för sökattributet "pop3", returnerar sökmotorn ett resultat med groupId="com.sun.mail" och artifactId="pop3".
  • Förvarsförvaltare. Repositories implementeras med hjälp av Maven Repository Managers som Apache Archiva, Nexus (tidigare Proximity), Artifactory, Codehaus Maven Proxy eller Dead Simple Maven Proxy [26] .

En beroendeomfattning låter dig inkludera beroenden endast i ett visst skede av projektuppbyggnaden. Det finns 6 möjliga områden [27] :

  1. sammanställa. Standardområdet. Beroendet är tillgängligt i alla klasssökvägar i projektet. Distribueras till beroende projekt.
  2. försedd. Omfattningen liknar kompilering, förutom att JDK eller container själv kommer att tillhandahålla beroendet vid körning.
  3. körning. Beroendet behövs inte för kompilering, men behövs för exekvering.
  4. testa. Beroendet behövs inte för den normala driften av programmet, utan behövs bara för att kompilera och köra tester.
  5. systemet. Omfattningen liknar den som tillhandahålls förutom att JAR som innehåller beroendet är explicit specificerad. Artefakten letas inte upp i förvaret.
  6. import (eftersom Maven 2.0.9) endast används med ett pom-beroende i <dependencyManagement>. Beroendena för den aktuella POM ersätts med beroenden från den angivna POM.

Få projektet att se ut som Maven

Ett projekt som underhålls med Maven måste uppfylla vissa villkor för att kunna läsas av verktyget, analyseras och byggas. Detta medför vissa begränsningar för katalogstrukturen och kräver ytterligare steg om projektet initialt har en annan struktur. [28]

För att Maven ska känna igen ett projekt som bearbetat måste det innehålla en etablerad katalogstruktur. Alla källkodsfiler måste finnas i den relativa sökvägen " \src\main\java " [17] .

Webbprojektets konfigurationsfil web.xml måste finnas i katalogen \src\main\webapp\WEB-INF [17 ] .

Pom.xml- konfigurationsfilen för ett Maven-projekt måste finnas i projektets rotkatalog. Enligt dess syfte kan den innehålla ett fjärrlager, plugins för att skapa arkiv, en kompilatorplugin och så vidare. Webbprojektet behöver också lägga till ytterligare beroenden, såsom javaee.jar.

Så konfigurationsfilen för utgående webbprojekt, i överensstämmelse med Maven, ser ut så här:

<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> <resurs> <katalog> ${basedir }/src/main/java </directory> <targetPath> WEB-INF/klasser </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>

När alla ovanstående krav har uppfyllts är Maven-projektet redo att utföra livscykelfaser som kompilering, arkivbygge och dokumentationsgenerering [29] .

Ett exempel på utdataloggen för meddelanden när du kör kommandot mvn war:war:

E:\workspace\servletdemo>mvnwar:war [INFO] Söker efter projekt... ....... [INFO] Bearbetar krigsprojekt [INFO] Kopiera webbappsresurser[E:\workspace\servletdemo] [INFO] Webbapp samlad på [47 ms] [INFO] Building war: E:\workspace\servletdemo\target\servletdemo-1.0-SNAPSHOT.war [INFO]----------------------------------------------- ----- [INFO] BYGGNAD [INFO]----------------------------------------------- -----

Interaktion med utvecklingsmiljöer

För vissa IDE :er tillhandahåller Maven plugins som låter dig hantera livscykeln genom att utföra kommandon med hjälp av IDE-gränssnittet. Listan över sådana utvecklingsmiljöer inkluderar Eclipse (via M2eclipse plugin ), IntelliJ IDEA , NetBeans , JBuilder , JDeveloper (version 11.1.2), MyEclipse, Emacs [30]

Dessa plugins ger också möjligheten att bekvämt redigera POM eller använda POM för att fullständigt beskriva projektets beroenden för behoven hos den IDE du använder.

Anteckningar

  1. CrunchBase  (engelska) - 2007.
  2. https://maven.apache.org/docs/3.8.6/release-notes.html
  3. https://www.zhihu.com/question/20297619
  4. Maven2 Open Source Project på Open Hub: Languages-sidan - 2006.
  5. https://projects.apache.org/json/projects/maven.json
  6. Arkiverad kopia (länk ej tillgänglig) . Hämtad 26 februari 2012. Arkiverad från originalet 19 februari 2012.   POM
  7. Maven - Vad är Maven? . Hämtad 25 februari 2012. Arkiverad från originalet 21 februari 2012.
  8. Apache Maven Community. Apache Maven Compiler Plugin . Apache Maven-projektet . Tillträdesdatum: 18 december 2015. Arkiverad från originalet 13 december 2015.
  9. Historiskt arkiv av Maven-versioner Arkiverad 11 februari 2012 på Wayback Machine .
  10. Maven 1.x officiella sida Arkiverad 15 februari 2012.
  11. ↑ 1 2 Apache Maven Foundation. Maven Release History . Apache Maven Docs . Hämtad 20 december 2015. Arkiverad från originalet 19 december 2015.
  12. ↑ 1 2 Apache Foundations. Minsta innehållet i en POM-fil är . Apache Maven-projektet . Hämtad 6 oktober 2007. Arkiverad från originalet 19 november 2017.
  13. Super POM Arkiverad 19 november 2017 på Wayback Machine .
  14. Maven av exempel Arkiverad 15 september 2020 på Wayback Machine .
  15. Vad är konvention över konfiguration? . Hämtad 28 oktober 2016. Arkiverad från originalet 14 september 2016.
  16. Apache Maven Foundation. Maven dokumentation. Arketyper. . Tillträdesdatum: 18 december 2015. Arkiverad från originalet 22 december 2015.
  17. ↑ 1 2 3 Apache Mavens officiella sida: Katalogstruktur Arkiverad 21 februari 2012 på Wayback Machine .
  18. Maven Build Lifecycle Reference Arkiverad 17 november 2017 på Wayback Machine .
  19. .NET Maven Plugin Arkiverad 27 oktober 2016 på Wayback Machine .
  20. Native Maven Plugin Arkiverad 29 oktober 2016 på Wayback Machine .
  21. NAR-plugin Arkiverad 20 december 2017 på Wayback Machine .
  22. Maven Compiler Plugin Arkiverad 15 december 2017 på Wayback Machine .
  23. Maven - Tillgängliga plugins Arkiverad 24 juli 2017 på Wayback Machine .
  24. Maven Central Repository Arkiverad 26 april 2020 på Wayback Machine .
  25. Maven sökmotor Arkiverad 26 april 2020 på Wayback Machine .
  26. Jämförelsetabell Arkiverad 23 november 2012.
  27. Apache Maven Foundation. maven dokumentation. En introduktion till beroendemekanismen . Tillträdesdatum: 18 december 2015. Arkiverad från originalet 20 december 2015.
  28. Hur man konverterar ett webbprojekt till ett Maven-projekt Arkiverad 21 februari 2012 på Wayback Machine .
  29. Apache Foundation. Bygga ett projekt med Maven . Apache Maven-dokumentation . Tillträdesdatum: 21 december 2015. Arkiverad från originalet 3 januari 2016.
  30. EmacsWiki: Malabar Mode Arkiverad 3 november 2013 på Wayback Machine .

Länkar

  • Vygovsky Leonid. Installation av Artifactory maven-förvaret (5 januari 2010). — Den här artikeln innehåller detaljerade instruktioner om hur man installerar ett Maven-förråd på en Glassfish-applikationsserver eller en Apache Tomcat-servletbehållare. Åtkom 5 januari 2010. Arkiverad 29 februari 2012.