Apache Maven

Apache Maven
Type Byg automatisering og pakkehåndteringssystem
Udvikler Apache Software Foundation
Skrevet i Java [3] [4] [5]
Operativ system på tværs af platforme
Første udgave 1. februar 2008 [1]
Hardware platform Java virtuel maskine
nyeste version
Læsbare filformater maven metadata [d]
Genererede filformater maven metadata [d]
Licens Apache-licens 2.0
Internet side maven.apache.org
 Mediefiler på Wikimedia Commons

Apache Maven  er en ramme til automatisering af samlingen af ​​projekter baseret på beskrivelsen af ​​deres struktur i filer i POM ( Project Object Model ) sproget ,  som er en delmængde af XML [6] . Maven-projektet er udgivet af Apache Software Foundation , hvor det formelt er en del af Jakarta-projektet .

Systemets navn er et jiddisch ord , hvis betydning groft kan udtrykkes som "indsamler af viden" [7] .

Maven leverer deklarativ , ikke bydende (i modsætning til Apache Ant byggeautomatiseringsværktøj ) projektopbygning. Projektbeskrivelsesfiler indeholder projektspecifikationen, ikke individuelle udførelseskommandoer. Alle filbehandlingsopgaver beskrevet i specifikationerne håndteres af Maven gennem en række indbyggede og eksterne plugins.

Maven bruges til at bygge og administrere projekter skrevet i JavaC#RubyScala og andre sprog [8] .

Bemærkelsesværdige alternativer inkluderer Gradle automatiserede byggesystem , som er bygget på principperne fra Apache Ant og Maven, men bruger en specialiseret Groovy DSL i stedet for en POM-konfiguration.

Udviklingshistorie

Maven blev skabt af canadiske Jason van Zyl og Sonatype , et firma han grundlagde . Det startede som et delprojekt af Apache Turbine i 2002, og i 2003 blev Maven kvalificeret som et Apache-projekt på topniveau, samtidig med at dets første version udkom - Maven 1.x, udgivet den 13. juli 2004 som version 1.0. Dette skete dog så hurtigt, at nogle detaljer ikke blev gennemtænkt, for eksempel for meget konfiguration, ydeevneproblemer.

Derfor blev konceptet færdiggjort, og i 2005 begyndte en parallel udvikling af Maven 2.x, som blev leveret i version 2.0 den 19. oktober 2005. [9]

Maven 1.x er ikke videreudviklet og er begrænset til brugersupport og fejlrettelser. [ti]

Udviklingen af ​​Maven 3.0 startede i 2008. Efter otte alpha-udgivelser blev den første betaversion af Maven 3.0 udgivet i oktober 2010. Der er blevet lagt særlig vægt på dens bagudkompatibilitet med Maven 2. For de fleste projekter kræver flytning fra Maven 2 til Maven 3 ingen ændringer [11] .

Maven udvikling finder sted i følgende delprojekter:

Projektbeskrivelse Objektmodel

Oplysningerne til at bygge et projekt understøttet af Apache Maven er indeholdt i en XML -fil kaldet pom.xml . Ved opstart kontrollerer Maven, at konfigurationsfilen indeholder alle de nødvendige data, og at alle data er syntaktisk korrekte.

Et eksempel på pom.xml fil :

<project> <!-- modelversion for Maven 2.x POM'er er altid 4.0.0 --> <modelVersion> 4.0.0 </modelVersion> <!-- koordinater for projektet, det vil sige et sæt værdier, der giver dig mulighed for entydigt at identificere dette projekt --> <groupId> com.mycompany.app </groupId> <artifactId> my-app </artifactId> <version> 1.0 </version> <!-- biblioteksafhængigheder --> <afhængigheder> <afhængigheder> <!-- koordinater for påkrævet bibliotek --> <groupId> junit </groupId> <artifactId> junit </artifactId> <version> 3.8.1 </version> <!-- dette bibliotek bruges kun til at køre og kompilere test --> <scope> test </scope> </dependency> </dependencies> </project>

Minimumskonfigurationen inkluderer versionen af ​​konfigurationsfilen, navnet på projektet, dets forfatter og versionen [12] . Ved hjælp af pom.xml konfigureres afhængigheder af andre projekter, individuelle faser af projektets byggeproces (byggeproces), en liste over plugins , der implementerer byggerækkefølgen [12] .

Store projekter kan opdeles i flere moduler eller delprojekter med hver sin POM. Operationer på moduler kan udføres gennem en fælles root POM med en enkelt kommando.

Underprojekt POM-filer kan arve konfiguration fra andre konfigurationsfiler. Samtidig er alle konfigurationsfiler nødvendigvis arvet fra "Super POM"-filen [13] som standard. Super POM giver standardkonfiguration, såsom en standard mappestruktur, standard plugins, binding til livscyklusfaser og mere.

Grundlæggende begreber

Konfigurationskonventioner

Maven understøtter konvention-for-konfiguration- princippet , som går ud på, at et pågældende aspekt har brug for en konfiguration, hvis og kun hvis dette aspekt ikke opfylder nogle specifikationer. Som en konsekvens reducerer dette mængden af ​​konfiguration, der kræves uden at miste fleksibilitet. En konsekvens af dette princip er, at der ikke er behov for at specificere filstier eksplicit, hvilket forenkler indholdet af pom.xml . Imidlertid kan næsten alle de standarder, som Maven stoler på, ændres ved individuel konfiguration [14] [15] .

Arketyper

Maven bruger princippet om Maven arketyper (Eng. Archetypes ). En arketype er et værktøj af mønstre, som hver er defineret af et mønster eller model, i analogi med hvilke derivater skabes. [16]

Standardbiblioteksstrukturen er en af ​​Mavens implementeringer af arketypeprincippet. Følgende struktur viser de vigtigste mapper til et Java-projekt [17] :

  • Projektets rodmappe : fil pom.xml og alle yderligere undermapper
    • src : alle kildefiler
      • src/main : kildefiler til selve produktet
        • src/main/java : Java -kilde
        • src/main/resources : andre filer, der bruges under kompilering eller eksekvering, såsom egenskabsfiler
      • src/test : kildefiler, der er nødvendige for at konfigurere automatisk test
        • src/test/java : JUnit testcases til automatiseret test
    • target : alle filer oprettet under Mavens arbejde
      • mål/klasser : kompilerede Java-klasser

Livscyklus

Livscyklussen for et maven-projekt er en liste over navngivne faser, der bestemmer rækkefølgen af ​​handlinger, når det bygges. Mavens livscyklus indeholder tre uafhængige udførelsesordrer: [18]

  • clean - livscyklus for rengøring af projektet. Indeholder følgende faser:
    1. forrens
    2. ren
    3. post ren
  • standard er den vigtigste livscyklus, der indeholder følgende faser:
    1. validere - kontrollerer om projektstrukturen er komplet og korrekt.
    2. generere-kilder
    3. proceskilder
    4. generere-ressourcer
    5. procesressourcer
    6. kompilér - kilder kompileres.
    7. proces-test-kilder
    8. proces-test-ressourcer
    9. test kompilering
    10. test - den samlede kode testes af et forud forberedt sæt tests.
    11. pakke - pakning af kompilerede klasser og andre ressourcer. For eksempel i en JAR-fil.
    12. integration-test - softwaren som helhed eller dens store moduler udsættes for integrationstest. Interaktionen mellem komponenterne i softwareproduktet kontrolleres.
    13. installer - installer softwaren i det lokale Maven-lager for at gøre det tilgængeligt for andre projekter af den aktuelle bruger.
    14. deploy - En stabil version af softwaren distribueres til et eksternt Maven-lager for at gøre det tilgængeligt for andre brugere.
  • site - livscyklus for generering af projektdokumentation. Består af faser:
    1. præ-site
    2. websted
    3. post websted
    4. site-deploy

Standardlivscyklusser kan forbedres med funktionalitet ved hjælp af Maven-plugins. Plugins giver dig mulighed for at indsætte nye trin i standardcyklussen (for eksempel distribution til applikationsserveren) eller udvide eksisterende trin.

Arkitektur

Maven er baseret på en plugin - arkitektur, der giver dig mulighed for at bruge plugins til forskellige opgaver ( kompilere ,  teste, bygge, deploy, checkstyle, pmd, scp-transfer ) til et givet projekt, uden at skulle installere dem eksplicit. Dette er muligt på grund af det faktum, at informationen kommer til plugin'et gennem standardindgangen, og resultaterne skrives til dets standardoutput. Teoretisk giver dette enhver mulighed for at skrive plug-ins for at interagere med projektets byggeværktøjer (kompilatorer, testværktøjer og så videre) til ethvert andet sprog. I virkeligheden er understøttelse af andre sprog end Java i øjeblikket minimal. Der er et plugin til .NET frameworket [19] samt plugins til C / C++ [20] [21] .

Antallet af tilgængelige plugins er i øjeblikket meget stort og omfatter blandt andet plugins, der giver dig mulighed for at køre en webapplikation direkte fra Maven for at teste den i en browser; plugins, der giver dig mulighed for at teste eller oprette databanker; plugins, der giver dig mulighed for at generere webtjenester. Udviklerens opgave i en sådan situation er at finde og anvende det mest passende sæt plug-ins.

Pluginnet opnår en række mål med følgende syntaks:

mvn [pluginnavn]:[målnavn]

For eksempel kan et Java-projekt kompileres med et compiler-plugin [22] ved at udføre kommandoen mvn compiler:compile.

Der er Maven-plugins til bygning, test, kildekontrol, drift af en webserver, generering af Eclipse - projektfiler og mere. [23] Plugins er listet og konfigureret i en sektion af pom.xml<plugins> -filen . Nogle grundlæggende grupper af plugins er inkluderet i hvert projekt som standard.

Afhængigheder

Filen pom.xml specificerer de afhængigheder, som et Maven-administreret projekt har. Afhængighedslederen er baseret på flere kerneprincipper:

  • Depoter. Maven leder efter de nødvendige filer i lokale mapper eller i det lokale maven-lager. Hvis afhængigheden ikke kan løses lokalt, opretter Maven forbindelse til det angivne maven-lager på netværket og kopierer til det lokale lager. Maven bruger Maven Central Repository [24] som standard , men udvikleren kan konfigurere andre offentlige Maven-depoter såsom Apache, Ibiblio, Codehaus eller Java.Net.
  • transitive afhængigheder. De nødvendige biblioteker indlæses automatisk i projektet. Ved løsning af versionskonflikter anvendes princippet om den "nærmeste" afhængighed, det vil sige, at afhængigheden er valgt, hvortil den vej gennem listen over afhængige projekter er den korteste.
  • Fjern afhængigheder. Projektbeskrivelsesfilen giver mulighed for at udelukke en afhængighed i tilfælde af påvisning af cyklicitet eller manglende behov for et bestemt bibliotek.
  • Søg efter afhængigheder. Afhængigheder (open source-biblioteker og moduler) søges efter deres koordinater (groupId, artifactId og version). Disse koordinater kan bestemmes ved hjælp af specielle søgemaskiner, såsom Maven-søgemaskinen [25] . For eksempel, for søgeattributten "pop3", returnerer søgemaskinen et resultat med groupId="com.sun.mail" og artifactId="pop3".
  • Depotforvaltere. Repositories er implementeret ved hjælp af Maven Repository Managers såsom Apache Archiva, Nexus (tidligere Proximity), Artifactory, Codehaus Maven Proxy eller Dead Simple Maven Proxy [26] .

Et afhængighedsomfang giver dig mulighed for kun at inkludere afhængigheder på et bestemt trin af projektopbygningen. Der er 6 mulige områder [27] :

  1. udarbejde. Standardområdet. Afhængigheden er tilgængelig i alle klassesøgestier i projektet. Distribueret til afhængige projekter.
  2. stillet til rådighed. Omfanget ligner kompilering, bortset fra at JDK eller container selv vil levere afhængigheden ved kørsel.
  3. køretid. Afhængigheden er ikke nødvendig for kompilering, men er nødvendig for udførelse.
  4. prøve. Afhængigheden er ikke nødvendig for den normale drift af applikationen, men er kun nødvendig for at kompilere og køre test.
  5. system. Omfanget svarer til det forudsatte, bortset fra at JAR'en, der indeholder afhængigheden, er eksplicit specificeret. Artefaktet er ikke slået op i depotet.
  6. import (siden Maven 2.0.9) bruges kun med en pom-afhængighed i <dependencyManagement>. Afhængighederne af den aktuelle POM erstattes med afhængighederne fra den angivne POM.

At få projektet til at ligne Maven

Et projekt, der vedligeholdes med Maven, skal opfylde visse betingelser for at kunne læses af hjælpeprogrammet, analyseres og bygges. Dette pålægger nogle begrænsninger for biblioteksstrukturen og kræver yderligere trin, hvis projektet oprindeligt har en anden struktur. [28]

For at Maven kan genkende et projekt som under behandling, skal det indeholde en etableret mappestruktur. Alle kildekodefiler skal være placeret i den relative sti " \src\main\java " [17] .

Webprojektets konfigurationsfil web.xml skal være placeret i mappen \src\main\webapp\WEB-INF [17 ] .

Pom.xml- konfigurationsfilen for et Maven-projekt skal være placeret i projektets rodbibliotek. Ifølge dets formål kan det indeholde et fjernlager, plugins til oprettelse af arkiver, et kompileringsplugin og så videre. Webprojektet skal også tilføje yderligere afhængigheder, såsom javaee.jar.

Så output-webprojektets konfigurationsfil, i overensstemmelse med Maven, ser sådan ud:

<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/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 alle ovenstående krav er opfyldt, er Maven-projektet klar til at udføre livscyklusfaser såsom kompilering, arkivopbygning og dokumentationsgenerering [29] .

Et eksempel på outputloggen af ​​meddelelser, når kommandoen udføres mvn war:war:

E:\workspace\servletdemo>mvnwar:war [INFO] Scanner efter projekter... ....... [INFO] Behandling af krigsprojekt [INFO] Kopiering af webapp-ressourcer[E:\workspace\servletdemo] [INFO] Webapp samlet på[47 msek.] [INFO] Building war: E:\workspace\servletdemo\target\servletdemo-1.0-SNAPSHOT.war [INFO]------------------------------------------------------- ----- [INFO] BYGGER SUCCES [INFO]------------------------------------------------------- -----

Interaktion med udviklingsmiljøer

For nogle IDE'er leverer Maven plugins, der giver dig mulighed for at styre livscyklussen ved at udføre kommandoer ved hjælp af IDE-grænsefladen. Listen over sådanne udviklingsmiljøer inkluderer Eclipse (via M2eclipse plugin ), IntelliJ IDEA , NetBeans , JBuilder , JDeveloper (version 11.1.2), MyEclipse, Emacs [30]

Disse plugins giver også mulighed for bekvemt at redigere POM'en eller bruge POM'en til fuldt ud at beskrive projektets afhængigheder for behovene for den IDE, du bruger.

Noter

  1. CrunchBase  (engelsk) - 2007.
  2. https://maven.apache.org/docs/3.8.6/release-notes.html
  3. https://www.zhihu.com/question/20297619
  4. Maven2 Open Source-projektet på Open Hub: Languages-side - 2006.
  5. https://projects.apache.org/json/projects/maven.json
  6. Arkiveret kopi (link ikke tilgængeligt) . Hentet 26. februar 2012. Arkiveret fra originalen 19. februar 2012.   POM
  7. Maven - Hvad er Maven? . Hentet 25. februar 2012. Arkiveret fra originalen 21. februar 2012.
  8. Apache Maven-fællesskabet. Apache Maven Compiler Plugin . Apache Maven-projektet . Dato for adgang: 18. december 2015. Arkiveret fra originalen 13. december 2015.
  9. Historisk arkiv af Maven-versioner Arkiveret 11. februar 2012 på Wayback Machine .
  10. Maven 1.x officielle side Arkiveret 15. februar 2012.
  11. ↑ 1 2 Apache Maven Foundation. Maven Udgivelseshistorie . Apache Maven Docs . Hentet 20. december 2015. Arkiveret fra originalen 19. december 2015.
  12. ↑ 1 2 Apache Foundations. Minimumsindholdet af en POM-fil er . Apache Maven-projektet . Hentet 6. oktober 2007. Arkiveret fra originalen 19. november 2017.
  13. Super POM Arkiveret 19. november 2017 på Wayback Machine .
  14. Maven by Example Arkiveret 15. september 2020 på Wayback Machine .
  15. Hvad er konvention over konfiguration? . Hentet 28. oktober 2016. Arkiveret fra originalen 14. september 2016.
  16. Apache Maven Foundation. Maven dokumentation. Arketyper. . Dato for adgang: 18. december 2015. Arkiveret fra originalen 22. december 2015.
  17. ↑ 1 2 3 Apache Mavens officielle side: Directory Structure Arkiveret 21. februar 2012 på Wayback Machine .
  18. Maven Build Lifecycle Reference Arkiveret 17. november 2017 på Wayback Machine .
  19. .NET Maven Plugin Arkiveret 27. oktober 2016 på Wayback Machine .
  20. Native Maven Plugin Arkiveret 29. oktober 2016 på Wayback Machine .
  21. NAR-plugin Arkiveret 20. december 2017 på Wayback Machine .
  22. Maven Compiler Plugin Arkiveret 15. december 2017 på Wayback Machine .
  23. Maven - Tilgængelige plugins Arkiveret 24. juli 2017 på Wayback Machine .
  24. Maven Central Repository Arkiveret 26. april 2020 på Wayback Machine .
  25. Maven søgemaskine Arkiveret 26. april 2020 på Wayback Machine .
  26. Sammenligningstabel Arkiveret 23. november 2012.
  27. Apache Maven Foundation. maven dokumentation. En introduktion til afhængighedsmekanismen . Dato for adgang: 18. december 2015. Arkiveret fra originalen 20. december 2015.
  28. Sådan konverteres et webprojekt til et Maven-projekt Arkiveret 21. februar 2012 på Wayback Machine .
  29. Apache Foundation. Opbygning af et projekt med Maven . Apache Maven dokumentation . Dato for adgang: 21. december 2015. Arkiveret fra originalen 3. januar 2016.
  30. EmacsWiki: Malabar Mode Arkiveret 3. november 2013 på Wayback Machine .

Links

  • Vygovsky Leonid. Installation af Artifactory maven-depotet (5. januar 2010). — Denne artikel giver detaljerede instruktioner om, hvordan man installerer et Maven-lager på en Glassfish-applikationsserver eller en Apache Tomcat-servletcontainer. Besøgt 5. januar 2010. Arkiveret 29. februar 2012.