Apache Maven

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Apache Maven jest narzędziem automatyzującym budowę oprogramowania na platformę Java. Poszczególne funkcjonalności Mavena realizowane są poprzez wtyczki, które są automatycznie pobierane przy ich pierwszym wykorzystaniu. Plik określający sposób budowy aplikacji nosi nazwę POM-u (ang. Project Object Model). Maven wywodzi się z projektu Jakarta. Tak jak i inne produkty fundacji Apache, Maven jest rozprowadzany na licencji Apache License.

Proces budowania[edytuj | edytuj kod]

Cele[edytuj | edytuj kod]

Budowanie oprogramowania ma zakończyć się osiągnięciem wybranego przez budującego celu. Dostępnych celów jest wiele. Pula celów nie jest bezpośrednio określona przez twórcę POM-a, tak jak ma to miejsce w przypadku Anta lub Make'a, lecz przez wtyczki rozszerzające funkcjonalność Mavena. Poszczególne cele mogą wymagać wcześniejszej realizacji innych celów, np. cel package (zbudowanie paczki dystrybucyjnej) wymaga uprzedniej realizacji compile (kompilacja kodów źródłowych) oraz test (uruchomienie testów automatycznych).

Główny cykl życia[edytuj | edytuj kod]

Mianem głównego cyklu życia projektu określa się uszeregowanych kolejno osiem najważniejszych z punktu widzenia budowy aplikacji celów. Powodzenie każdego kolejnego celu uzależnione jest od pomyślnej realizacji celów znajdujących się wcześniej w cyklu.

  • validate - sprawdzenie, czy projekt jest poprawny i czy wszystkie niezbędne informacje zostały określone
  • compile - kod źródłowy jest kompilowany
  • test - przeprowadzane są testy jednostkowe
  • package - budowana jest paczka dystrybucyjna
  • integration-test - zbudowany projekt umieszczany jest w środowisku testowym, gdzie przeprowadzane są testy integracyjne
  • verify - sprawdzenie, czy paczka jest poprawna
  • install - paczka umieszczana jest w repozytorium lokalnym - może być używana przez inne projekty jako zależność
  • deploy - paczka umieszczana jest w repozytorium zdalnym (opublikowana)

Ponadto Apache Maven może wykonać dodatkowe kroki, jeżeli jest to zdefiniowane w POM-ie, np. wygenerować stronę internetową projektu.

POM[edytuj | edytuj kod]

POM, czyli Project Object Model, to dokument XML-owy kompleksowo opisujący projekt. POM nie tylko precyzuje szczegóły budowy produktu, ale też może przechowywać informacje o zespole programistów, zastosowanych systemach wspomagających rozwój oprogramowania itd[1]. W Mavenie dokument POM nosi nazwę pom.xml.

Przykładowy POM[edytuj | edytuj kod]

<project>
  <modelVersion>4.0.0</modelVersion>
 
  <!-- Podstawowe informacje dla Mavena -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>...</packaging>
  <dependencies>...</dependencies>
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement>
  <modules>...</modules>
  <properties>...</properties>
 
  <!-- Ustawienia budowania -->
  <build>...</build>
 
  <!-- Ustawienia generowania strony HTML z dokumentacją i raportami -->
  <reporting>...</reporting>
 
  <!-- Ogólne informacje o projekcie -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>
 
  <!-- Ustawienia środowiska tworzenia projektu -->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists> 
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>

Powiązania pomiędzy POM-ami[edytuj | edytuj kod]

  • Agregacja - Mechanizm mający na celu rozbicie dużego projektu na podprojekty (moduły), by ułatwić zarządzanie źródłami. POM głównego projektu agreguje POM-y modułów, te zaś mogą agregować POM-y swoich podmodułów itd.
  • Dziedziczenie - Każdy POM ma rodzica, którym jest inny dokument POM. Eliminuje to potrzebę jawnego określania wszystkich elementów w POM-ie każdego modułu - jeżeli dana opcja nie została sprecyzowana w konkretnym POM-ie, to jest ona pobierana z rodzica. Jeżeli rodzic również jej nie określa, to z rodzica rodzica itd, ponieważ dziedziczenie POM-ów jest przechodnie. Jeżeli rodzic nie jest podany wprost, to jest nim tzw. Super POM - dokument określający domyślną konfigurację.
  • Zależność

Nie należy mylić dziedziczenia z agregacją - dziedziczenie to mechanizm mający na celu ograniczenie powielania treści POM-ów, podczas gdy agregacja ma na celu modularyzację projektu. Dziedziczenie jest niezależne od podziału projektu na moduły, choć oba mechanizmy bardzo często występują razem.

Tworzenie POM-a[edytuj | edytuj kod]

Programista może napisać POM-a samodzielnie od podstaw, prościej jednak użyć Mavena, który potrafi wygenerować prostego POM-a samodzielnie:

mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app

W rezultacie powstanie następujący POM:

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Wtyczki[edytuj | edytuj kod]

Większość funkcjonalności Mavena dostępna jest za pośrednictwem wtyczek. Każda z wtyczek Mavena posiada wyspecyfikowane cele które może realizować. Dany cel może być wywołany używając poniższej składni:

mvn [nazwa-wtyczki]:[nazwa-celu]

Przykładowo kompilacji kodu można dokonać wywołując mvn compile:compile.

Generowanie raportów[edytuj | edytuj kod]

Jedną z funkcjonalności Mavena jest zautomatyzowana generacja strony internetowej projektu. Strona, oprócz ogólnych informacji ustalanych na podstawie POM-a, zawiera również zbiór raportów dokumentujących projekt. W skład raportów wchodzą najczęściej Javadoc, kody źródłowe, PMD.

Maven a Ant[edytuj | edytuj kod]

Apache Ant jest innym narzędziem na platformę Java automatyzującym proces budowy oprogramowania. Pracując z Antem, programista tworzy skrypt (Buildfile) określający krok po kroku sposób budowy programu. W Mavenie natomiast określa raczej co ma zostać zbudowane i w jaki sposób, niż kiedy i w jakiej kolejności[2]. Kolejność wykonywania poszczególnych faz jest ustalana przez Mavena. Tym samym Maven wydaje się być mniej elastyczny niż Ant, nie jest to jednak prawdą, gdyż ostatecznie można nakazać Mavenowi wywołanie Anta[2]. Na korzyść Mavena przemawia fakt, że stworzenie i utrzymanie pliku POM wymaga zwykle znacznie mniej pracy, niż Antowego Buildfile'a.

Przypisy

Linki zewnętrzne[edytuj | edytuj kod]